我希望编写一个 LLVM 传递两个 i32 类型的参数来选择函数。我的第一次尝试(如下所示)失败了:
bool MyFunctionPass::runOnFunction(Function &f)
{
Type *int32 = Type::getInt32Ty(f.getParent()->getContext());
Argument *xC = new Argument(int32, "__xC", &f);
...
如果我尝试上述方法,模块验证程序会崩溃。新添加的参数类型是 junk 0xCDCDCDCD(未初始化的堆内存)。函数类型保持:
void (i32 addrspace(1)*, i32 addrspace(1)*, i32)
而不是被新的i32
.
此外,将参数直接添加到参数列表Function::getArgumentList()
失败,因为Argument
构造函数将自身链接到函数,这被检测为双链接。
- 我需要一个 ModulePass 来做到这一点,还是一个 FunctionPass 就足够了?
- 有没有一种优雅的方式来做到这一点?
谢谢!