Correctly handle global-argument aliases induced in main

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21537 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-04-25 19:16:31 +00:00
parent 63320cc841
commit a1198b5254

View File

@ -434,14 +434,42 @@ DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) {
void BUDataStructures::calculateGraph(DSGraph &Graph) { void BUDataStructures::calculateGraph(DSGraph &Graph) {
// If this graph contains the main function, clone the globals graph into this
// graph before we inline callees and other fun stuff.
bool ContainsMain = false;
DSGraph::ReturnNodesTy &ReturnNodes = Graph.getReturnNodes();
for (DSGraph::ReturnNodesTy::iterator I = ReturnNodes.begin(),
E = ReturnNodes.end(); I != E; ++I)
if (I->first->hasExternalLinkage() && I->first->getName() == "main") {
ContainsMain = true;
break;
}
// If this graph contains main, copy the contents of the globals graph over.
// Note that this is *required* for correctness. If a callee contains a use
// of a global, we have to make sure to link up nodes due to global-argument
// bindings.
if (ContainsMain) {
const DSGraph &GG = *Graph.getGlobalsGraph();
ReachabilityCloner RC(Graph, GG,
DSGraph::DontCloneCallNodes |
DSGraph::DontCloneAuxCallNodes);
// Clone the global nodes into this graph.
for (DSScalarMap::global_iterator I = GG.getScalarMap().global_begin(),
E = GG.getScalarMap().global_end(); I != E; ++I)
if (isa<GlobalVariable>(*I))
RC.getClonedNH(GG.getNodeForValue(*I));
}
// Move our call site list into TempFCs so that inline call sites go into the // Move our call site list into TempFCs so that inline call sites go into the
// new call site list and doesn't invalidate our iterators! // new call site list and doesn't invalidate our iterators!
std::list<DSCallSite> TempFCs; std::list<DSCallSite> TempFCs;
std::list<DSCallSite> &AuxCallsList = Graph.getAuxFunctionCalls(); std::list<DSCallSite> &AuxCallsList = Graph.getAuxFunctionCalls();
TempFCs.swap(AuxCallsList); TempFCs.swap(AuxCallsList);
DSGraph::ReturnNodesTy &ReturnNodes = Graph.getReturnNodes();
bool Printed = false; bool Printed = false;
std::vector<Function*> CalledFuncs; std::vector<Function*> CalledFuncs;
while (!TempFCs.empty()) { while (!TempFCs.empty()) {