我希望写一个LLVM传递,即i32类型的两个参数来选择函数。我的第一次尝试(如下图所示)失败了:
bool MyFunctionPass::runOnFunction(Function &f)
{
Type *int32 = Type::getInt32Ty(f.getParent()->getContext());
Argument *xC = new Argument(int32, "__xC", &f);
...
如果我尝试以上操作,模块验证程序会崩溃。新添加的参数类型是垃圾0xCDCDCDCD(未初始化的堆内存)。功能类型仍然是:
void (i32 addrspace(1)*, i32 addrspace(1)*, i32)
而不是被新i32
扩展。
此外,将参数直接添加到参数列表Function::getArgumentList()
失败,因为Argument
构造函数将自身链接到函数,并将其检测为双链接。
谢谢!
答案 0 :(得分:7)
为函数添加参数非常棘手 - 正如您所发现的,它并不像修改参数列表那么容易。
最简单的方法是首先创建一个包含所有原始参数+额外参数的新函数,然后调用CloneFunctionInto
将原始函数嵌入到新函数中。