diff options
Diffstat (limited to 'lib/Analysis/DataStructure')
-rw-r--r-- | lib/Analysis/DataStructure/DataStructure.cpp | 3 | ||||
-rw-r--r-- | lib/Analysis/DataStructure/Steensgaard.cpp | 16 |
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index 6460287ac7..7bad52ac3c 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -1657,7 +1657,8 @@ void DSGraph::markIncompleteNodes(unsigned Flags) { for (ReturnNodesTy::iterator FI = ReturnNodes.begin(), E =ReturnNodes.end(); FI != E; ++FI) { Function &F = *FI->first; - for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) + for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); + I != E; ++I) if (isPointerType(I->getType())) markIncompleteNode(getNodeForValue(I).getNode()); markIncompleteNode(FI->second.getNode()); diff --git a/lib/Analysis/DataStructure/Steensgaard.cpp b/lib/Analysis/DataStructure/Steensgaard.cpp index aa7f54b890..747ae2fc4b 100644 --- a/lib/Analysis/DataStructure/Steensgaard.cpp +++ b/lib/Analysis/DataStructure/Steensgaard.cpp @@ -167,14 +167,22 @@ bool Steens::runOnModule(Module &M) { } } - // Remove our knowledge of what the return values of the functions are. - ResultGraph->getReturnNodes().clear(); + // Remove our knowledge of what the return values of the functions are, except + // for functions that are externally visible from this module (e.g. main). We + // keep these functions so that their arguments are marked incomplete. + for (DSGraph::ReturnNodesTy::iterator I = + ResultGraph->getReturnNodes().begin(), + E = ResultGraph->getReturnNodes().end(); I != E; ) + if (I->first->hasInternalLinkage()) + ResultGraph->getReturnNodes().erase(I++); + else + ++I; // Update the "incomplete" markers on the nodes, ignoring unknownness due to // incoming arguments... ResultGraph->maskIncompleteMarkers(); - ResultGraph->markIncompleteNodes(DSGraph::IgnoreFormalArgs | - DSGraph::IgnoreGlobals); + ResultGraph->markIncompleteNodes(DSGraph::IgnoreGlobals | + DSGraph::MarkFormalArgs); // Remove any nodes that are dead after all of the merging we have done... // FIXME: We should be able to disable the globals graph for steens! |