[LLVMdev] Remove function from module
Михаил
neonomaly.x at gmail.com
Mon Apr 23 01:49:36 PDT 2012
Thanks.
I try to delete function like this (rta_IsFunctionVisited.find - set of good functions) :
// delete dead functions
for (Module::iterator Fx = M->begin(), FE = M->end(); Fx!=FE; Fx++) {
if (rta_IsFunctionVisited.find(Fx)==rta_IsFunctionVisited.end()) {
Fx->replaceAllUsesWith(UndefValue::get(Fx->getType()));
}
}
for (CallGraph::iterator CGN = CG.begin(); CGN!=CG.end(); CGN++) {
if (rta_IsFunctionVisited.find(CGN->second->getFunction())==rta_IsFunctionVisited.end()) {
CGN->second->removeAllCalledFunctions();
}
}
for (Module::iterator Fx = M->begin(), FE = M->end(); Fx!=FE;) {
if (rta_IsFunctionVisited.find(Fx)==rta_IsFunctionVisited.end()) {
CallGraphNode *CGN = CG.getOrInsertFunction(Fx);
CG.removeFunctionFromModule(Fx);
wasChanged=true;
Fx=M->begin();
} else Fx++;
}
return true;
But I still have a bug:
opt(63981) malloc: *** error for object 0x7ff1394050a0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
0 libLLVM-3.0.dylib 0x00000001082d7605 _ZL15PrintStackTracePv + 53
1 libLLVM-3.0.dylib 0x00000001082d7c6c _ZL13SignalHandleri + 364
2 libsystem_c.dylib 0x00007fff9152dcfa _sigtramp + 26
3 libsystem_c.dylib 0x00007fff66d6a878 _sigtramp + 18446744072996768664
4 libsystem_c.dylib 0x00007fff9152b84c free + 389
5 libLLVM-3.0.dylib 0x00000001083536b0 __gnu_cxx::new_allocator<std::pair<llvm::WeakVH, llvm::CallGraphNode*> >::deallocate(std::pair<llvm::WeakVH, llvm::CallGraphNode*>*, unsigned long) + 32
6 libLLVM-3.0.dylib 0x000000010835360e std::_Vector_base<std::pair<llvm::WeakVH, llvm::CallGraphNode*>, std::allocator<std::pair<llvm::WeakVH, llvm::CallGraphNode*> > >::_M_deallocate(std::pair<llvm::WeakVH, llvm::CallGraphNode*>*, unsigned long) + 62
7 libLLVM-3.0.dylib 0x00000001083535bd std::_Vector_base<std::pair<llvm::WeakVH, llvm::CallGraphNode*>, std::allocator<std::pair<llvm::WeakVH, llvm::CallGraphNode*> > >::~_Vector_base() + 45
8 libLLVM-3.0.dylib 0x0000000108353509 std::vector<std::pair<llvm::WeakVH, llvm::CallGraphNode*>, std::allocator<std::pair<llvm::WeakVH, llvm::CallGraphNode*> > >::~vector() + 105
9 libLLVM-3.0.dylib 0x0000000108353495 std::vector<std::pair<llvm::WeakVH, llvm::CallGraphNode*>, std::allocator<std::pair<llvm::WeakVH, llvm::CallGraphNode*> > >::~vector() + 21
10 libLLVM-3.0.dylib 0x000000010852be3e llvm::CallGraphNode::~CallGraphNode() + 110
11 libLLVM-3.0.dylib 0x0000000108529d55 llvm::CallGraphNode::~CallGraphNode() + 21
12 libLLVM-3.0.dylib 0x0000000108528468 llvm::CallGraph::destroy() + 264
13 libLLVM-3.0.dylib 0x00000001085295f8 (anonymous namespace)::BasicCallGraph::destroy() + 120
14 libLLVM-3.0.dylib 0x0000000108529379 (anonymous namespace)::BasicCallGraph::releaseMemory() + 25
15 libLLVM-3.0.dylib 0x0000000107bf5d93 llvm::PMDataManager::freePass(llvm::Pass*, llvm::StringRef, llvm::PassDebuggingString) + 179
16 libLLVM-3.0.dylib 0x0000000107bf5c89 llvm::PMDataManager::removeDeadPasses(llvm::Pass*, llvm::StringRef, llvm::PassDebuggingString) + 505
17 libLLVM-3.0.dylib 0x0000000107bf8ee8 llvm::MPPassManager::runOnModule(llvm::Module&) + 1016
18 libLLVM-3.0.dylib 0x0000000107bf949c llvm::PassManagerImpl::run(llvm::Module&) + 172
19 libLLVM-3.0.dylib 0x0000000107bf997d llvm::PassManager::run(llvm::Module&) + 29
20 opt 0x000000010717f057 main + 6903
21 opt 0x000000010716d7b4 start + 52
22 opt 0x0000000000000007 start + 18446744069295646855
Yours sincerely,
Kadysev Mikhail
22.04.2012, в 23:30, Nick Lewycky написал(а):
> Михаил wrote:
>> It is ModulePass with AnalysisUsage of CallGraph
>
> Ah, then you'll need to update the CallGraph first. Use "CG.removeFunctionFromModule(F);" before deleting it.
>
> Nick
>
>> Yours sincerely,
>> Kadysev Mikhail
>>
>> 22.04.2012, в 5:20, Nick Lewycky написал(а):
>>
>>> Михаил wrote:
>>>> Thanks, but I replaceAllUsesWith() - works well, but I still get bug in
>>>> eraseFromParent():
>>>>
>>>> While deleting: i32 (%class.B*, i32)* %_ZN1B1xEi
>>>> An asserting value handle still pointed to this value!
>>>> UNREACHABLE executed at
>>>> /Users/neonomaly/LLVM/LLVM/lib/VMCore/Value.cpp:561!
>>>
>>> The replaceAllUsesWith + eraseFromParent pattern remains correct, but
>>> there's more to the story than the parts we've focused on. This error
>>> means that there's some other code that is holding a pointer to the
>>> function you tried to delete, but is using AssertingVH to do so, so as
>>> to catch errors exactly like this producing a dangling pointer.
>>>
>>> The error message doesn't tell us who owns the AssertingVH (indeed,
>>> the asserting-vh doesn't know, much like a pointer doesn't know who
>>> owns it).
>>>
>>> So, under what circumstance are you doing this deletion? Is it inside
>>> a FunctionPass, or another kind of Pass? Are you using AssertingVH's
>>> or calling other code that is? Such as ValueMap's, or some llvm
>>> analysis pass which stores an AssertingVH?
>>>
>>> Nick
>>>
>>>>
>>>>
>>>> Yours sincerely,
>>>> Kadysev Mikhail
>>>>
>>>> 21.04.2012, в 23:45, Nick Lewycky написал(а):
>>>>
>>>>> Михаил wrote:
>>>>>> How correctly remove function from module?
>>>>>> For example:
>>>>>>
>>>>>> int f1(int x) {
>>>>>> ...
>>>>>> a = f2(smth);
>>>>>> ...
>>>>>> }
>>>>>> int f2 (int y) {
>>>>>> ...
>>>>>> b = f1(smth);
>>>>>> ...
>>>>>> }
>>>>>>
>>>>>> I need delete from module both f1 and f2. They haven't uses in other
>>>>>> part of module, but I can't delete them with eraseFromParent, because
>>>>>> they are use each other.
>>>>>
>>>>> Call X->replaceAllUsesWith(UndefValue::get(X->getType)) before calling
>>>>> X->eraseFromParent().
>>>>>
>>>>> Nick
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120423/245e851d/attachment.html>
More information about the llvm-dev
mailing list