Fix a problem where we not marking incoming arguments to functions with

external linkage as incomplete.

llvm-svn: 20927
This commit is contained in:
Chris Lattner 2005-03-29 19:16:59 +00:00
parent db45f7d763
commit 2e1971c19d
2 changed files with 14 additions and 5 deletions

View File

@ -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());

View File

@ -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!