在LLVM中为函数添加参数

5

我希望编写一个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?
  • 有没有更优雅的方法来完成这个操作?

谢谢!

1个回答

8

在函数中添加参数是令人惊讶的棘手-正如您所发现的那样,这并不像修改参数列表那么容易。

最可靠的方法可能是首先创建一个具有所有原始参数+额外参数的新函数,然后调用CloneFunctionInto将原始函数嵌入到您的新函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接