LLVM:SSA调用具有动态编号的函数+;参数类型

LLVM:SSA调用具有动态编号的函数+;参数类型,llvm,llvm-ir,calling-convention,abi,Llvm,Llvm Ir,Calling Convention,Abi,在LLVM和C中,可以从被调用函数中的va_列表中提取参数,直到运行时才知道参数的编号和类型 这样,在伪代码中(让我知道这是否离SSA太远;尝试保持清晰/简短/高级): 我想做镜像:从被调用函数外部(即在调用站点)将参数插入va_列表,直到运行时才知道参数的数量和类型。(不过,假设我有足够的元数据来匹配被调用方签名,不管它是什么) 像这样(同样是伪代码): 可以在LLVM中以这种方式动态构造函数调用指令吗?假设不可以/不可能重新定义被调用方的签名以接受指向va_arg的指针(尽管我不确定这是否有

在LLVM和C中,可以从被调用函数中的
va_列表
中提取参数,直到运行时才知道参数的编号和类型

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

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

像这样(同样是伪代码):

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


据我所知,
call
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)
            }
            ...
        }
    }
}
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);
}