我希望编写一个LLVM Pass,用于选择函数中的两个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
构造函数会将自身链接到函数中,这被检测为双重链接。
- 我需要使用ModulePass还是FunctionPass?
- 有没有更优雅的方法来完成这个操作?
谢谢!