5

我希望编写一个 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 就足够了?
  • 有没有一种优雅的方式来做到这一点?

谢谢!

4

1 回答 1

8

向函数添加参数非常棘手 - 正如您所发现的,它不像修改参数列表那么容易。

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

于 2014-03-19T08:10:47.103 回答