llvm - 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 的指针是不可接受/不可能的(尽管我不确定这是否会有所帮助?)。
据我所知,call
SSA 指令需要一个编译时参数序列和一个编译时类型签名。是否有标志、语法或不同的指令来解决这个问题,并按照上面的描述进行操作?
解决方案
推荐阅读
- javascript - 在firebase中更改规则时出错
- reactjs - JSSIP 如何在音频通话和视频通话之间切换
- c# - 同一集合中的排序逻辑
- python - 如何将 2 个不同的数据集提供给 2 个不同的 cnn
- c# - Gmap.net 上的地图比例尺
- android - 设置不同的回收器视图不同的适配器都显示相同
- excel - EXCEL VBA尝试将数据从一个工作表上的非连续单元格复制到单独工作表上的下一个可用行
- jquery - 使用 .map() 将数组中的项目转换为一组选项
- javascript - D3 - 多个文本元素上的 v5 更新模式
- c# - HttpPost [FromBody] 参数设置为特定对象时为空,但设置为字符串时不为空,并且可以在方法中转换为该对象