Remove functions from module

Hello,

I have a Problem I just can not understand. I want to reduce the Module to the Subgraph which has a given function as root.

I first calculate a list of functions I want to keep:

//Find all called functions from this CallNode recursively
std::vectorllvm::Function* calledFunctionsFromEntryPointList;
calcCalledFunctionsFromEntryPoint(entry, &calledFunctionsFromEntryPointList);

Then I am dropping all calls to CallGraphNodes not in the list and try to delete them afterwards.

//Drop calls //TODO
for (llvm::CallGraph::iterator G = callGraph.begin(), end = callGraph.end(); G != end; ++G) {
if(G->second->getFunction())
{
if(std::find(calledFunctionsFromEntryPointList.begin(),calledFunctionsFromEntryPointList.end(),G->second->getFunction()) == calledFunctionsFromEntryPointList.end())
{
std::cout << “Function:” << G->second->getFunction()->getName().str() << " not in call List dropping called functions\n";
G->second->removeAllCalledFunctions();
}
}
else {
for (llvm::CallGraphNode::const_iterator CI = G->second->begin(), CE = G->second->end(); CI != CE; ++CI) {
if(std::find(calledFunctionsFromEntryPointList.begin(),calledFunctionsFromEntryPointList.end(),CI->second->getFunction()) == calledFunctionsFromEntryPointList.end())
{
if(CI->second->getFunction()){
G->second->removeAnyCallEdgeTo(CI->second);
}
}
}
}
}

//TODO Somehow there is a Bug that sometimes a Function after dropping calls is no longer a function and does not get deleted

//Drop not called functions //TODO
for (llvm::CallGraph::iterator G = callGraph.begin(), end = callGraph.end(); G != end; ++G) {
if(G->second->getFunction())
{
if(std::find(calledFunctionsFromEntryPointList.begin(),calledFunctionsFromEntryPointList.end(),G->second->getFunction()) == calledFunctionsFromEntryPointList.end())
{
std::cout << “Function:” << G->second->getFunction()->getName().str() << " not in call List deleting it\n";
G->second->getFunction()->dropAllReferences();
callGraph.removeFunctionFromModule(G->second);
}
}
}

The Problem now is that somehow functions become something else and i can not delete them.

However they are still in the list as they can be found with the iterator and addressed with the Callgraph node.

for (llvm::Module::iterator F = callGraph.getModule().begin(), end = callGraph.getModule().end(); F != end; ++F) {
if(std::find(calledFunctionsFromEntryPointList.begin(),calledFunctionsFromEntryPointList.end(),F) == calledFunctionsFromEntryPointList.end()){
std::cout << "Found Bug Function: " << callGraph[F]->getFunction()->getName().str() << std::endl;
callGraph[F]->getFunction()->dropAllReferences();
callGraph.getModule().getFunctionList().remove(F);
}
}

If I however try to delete it from the Callgraph instead just from the List with:

callGraph.removeFunctionFromModule(callGraph[F]);

I get a Segmentation fault.

And to make it even less understandable if I run the same code again I find new function not found in the first round.

for (llvm::Module::iterator F = callGraph.getModule().begin(), end = callGraph.getModule().end(); F != end; ++F) {
if(std::find(calledFunctionsFromEntryPointList.begin(),calledFunctionsFromEntryPointList.end(),F) == calledFunctionsFromEntryPointList.end()){
std::cout << "Found Bug Function: " << callGraph[F]->getFunction()->getName().str() << std::endl;
callGraph[F]->getFunction()->dropAllReferences();
callGraph.getModule().getFunctionList().remove(F);
}
}

Any help is appreciated.

Many Thanks

Andreas