应该如何清理 LLVM 函数克隆?
How should LLVM Function clones be cleaned up?
我有一个 LLVM pass,它遍历输入 IR 代码并对调用的函数执行分析。我的分析函数签名是 functionTracer(const Function* pFunc)
,我在 CallInst
的 getCalledFunction()
上调用它。
在我的分析函数开始时,我创建了一个我在分析过程中操作的传入函数的副本:
Function* pFunctionToAnalyze = CloneFunction(pFunction,VMap,false);
我有一个调用函数的 C++ main f2(int i)
:
int main(){
int a = 3;
int b = f2(a);
int c = f2(b);
}
我把这个code转成IR,提交到我的pass。我的代码似乎执行并执行了我想要的操作,但我得到以下错误输出:
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)
我是否需要在分析函数结束时手动清理 Cloned 函数 pFunctionToAnalyze
,以便在返回之前删除 Uses?有没有更好的方法复制函数内容进行分析可能会修改?
在 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();
这不是解决您的问题的方法吗?
我有一个 LLVM pass,它遍历输入 IR 代码并对调用的函数执行分析。我的分析函数签名是 functionTracer(const Function* pFunc)
,我在 CallInst
的 getCalledFunction()
上调用它。
在我的分析函数开始时,我创建了一个我在分析过程中操作的传入函数的副本:
Function* pFunctionToAnalyze = CloneFunction(pFunction,VMap,false);
我有一个调用函数的 C++ main f2(int i)
:
int main(){
int a = 3;
int b = f2(a);
int c = f2(b);
}
我把这个code转成IR,提交到我的pass。我的代码似乎执行并执行了我想要的操作,但我得到以下错误输出:
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)
我是否需要在分析函数结束时手动清理 Cloned 函数 pFunctionToAnalyze
,以便在返回之前删除 Uses?有没有更好的方法复制函数内容进行分析可能会修改?
在 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();
这不是解决您的问题的方法吗?