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