首页 > 解决方案 > LLVM:SSA 调用具有动态数量 + 参数类型的函数

问题描述

在 LLVM 和 C 中,可以从被调用函数内部提取参数,直到运行时才知道它们的数量和类型。va_list

像这样,在伪代码中(让我知道这是否与 SSA 相距太远;试图保持清晰/简短/高级):

fn callee(...) {
    args = va_list()
    va_start(args)

    // extract the args and use them:
    while not finished {
        switch (expected_type_of_arg()) {
            case "int" {
                int arg = va_arg(args, int)
            }
            case "float" {
                float arg = va_arg(args, float)
            }
            ...
        }
    }
}

我想做镜像:从被调用函数外部(即在调用站点)将参数插入到 a中,直到运行时才知道参数的数量和类型。(不过,假设我有足够的可用元数据来匹配被调用者签名,无论它可能是什么)。va_list

像这样(再次伪代码):

fn caller() {
    args = va_list()
    va_start(args, alloca(space_needed()))  // e.g.

    // insert the args for the callee:
    while not finished {
        switch (expected_type_of_arg()) {
            case "int" {
                va_assign(args, int, int_val)
            }
            case "float" {
                va_assign(args, float, float_val)
            }
            ...
        }
    }

    invoke(callee, va_list);
}

是否可以在 LLVM 中以这种方式动态构造函数调用指令?假设重新定义被调用者的签名以接受指向 va_arg 的指针是不可接受/不可能的(尽管我不确定这是否会有所帮助?)。

据我所知,callSSA 指令需要一个编译时参数序列和一个编译时类型签名。是否有标志、语法或不同的指令来解决这个问题,并按照上面的描述进行操作?

标签: llvmllvm-ircalling-conventionabi

解决方案


推荐阅读