在LLVM中向函数添加参数

时间:2014-03-19 01:22:30

标签: llvm llvm-c++-api

我希望写一个LLVM传递,即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 个答案:

答案 0 :(得分:7)

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

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