我有一个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
以在返回之前删除使用?有没有更好的方法来复制功能内容以进行分析,可能会对其进行修改?
答案 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();
这不是解决问题的方法吗?