如何清理LLVM功能克隆?

时间:2016-03-16 12:03:41

标签: llvm

我有一个LLVM传递,它遍历输入IR代码并对被调用函数执行分析。我的分析函数签名是functionTracer(const Function* pFunc),我在CallInst getCalledFunction()上调用它。

在我的分析功能开始时,我创建了一个在分析过程中操作的传入函数的副本:

Function* pFunctionToAnalyze = CloneFunction(pFunction,VMap,false); 

我有一个调用函数f2(int i)的C ++ main:

int main(){
    int a = 3;
    int b = f2(a);
    int c = f2(b);
}

我将此代码转换为IR并提交给我的通行证。我的代码似乎执行并执行我想要的操作,但我得到以下错误输出:

While deleting: i32 (i32)* %_Z2f2i
Use still stuck around after Def is destroyed:  %call1 = call i32 @_Z2f2i(i32 %1)
Use still stuck around after Def is destroyed:  %call = call i32 @_Z2f2i(i32 %0)
module: /home/src/extern/llvm/llvm-3.7.0.src/lib/IR/Value.cpp:82: 
virtual llvm::Value::~Value(): Assertion `use_empty() && "Uses remain when a value is destroyed!"' failed.
Aborted (core dumped)

我是否需要在分析函数结束时手动清理克隆函数pFunctionToAnalyze以在返回之前删除使用?有没有更好的方法来复制功能内容以进行分析,可能会对其进行修改?

1 个答案:

答案 0 :(得分:0)

在lib / Transforms / IPO / PartialInlining.cpp

中有一个例子
  // Clone the function, so that we can hack away on it.
  ValueToValueMapTy VMap;
  Function* duplicateFunction = CloneFunction(F, VMap,
                                              /*ModuleLevelChanges=*/false);

在传球结束时:

duplicateFunction->replaceAllUsesWith(F);
duplicateFunction->eraseFromParent();

这不是解决问题的方法吗?