在LLVM中向函数添加参数

Tim*_*Tim 5 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);
    ...
Run Code Online (Sandbox Code Playgroud)

如果我尝试上述操作,模块验证程序会崩溃.新添加的参数类型是垃圾0xCDCDCDCD(未初始化的堆内存).功能类型仍然是:

void (i32 addrspace(1)*, i32 addrspace(1)*, i32)
Run Code Online (Sandbox Code Playgroud)

而不是被新的扩展i32.

此外,将参数直接添加到参数列表Function::getArgumentList()失败,因为Argument构造函数将自身链接到函数,并将其检测为双链接.

  • 我需要一个ModulePass才能做到这一点,或者FunctionPass是否足够?
  • 这样做有一种优雅的方式吗?

谢谢!

Oak*_*Oak 7

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

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