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 написал(а):