[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/TopDownClosure.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sat Sep 20 17:25:00 PDT 2003
Changes in directory llvm/lib/Analysis/DataStructure:
TopDownClosure.cpp updated: 1.54 -> 1.55
---
Log message:
Do not mark incoming arguments to functions complete if the function is pointed to by a global in the globals graph
---
Diffs of the changes:
Index: llvm/lib/Analysis/DataStructure/TopDownClosure.cpp
diff -u llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.54 llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.55
--- llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.54 Sat Sep 20 11:34:11 2003
+++ llvm/lib/Analysis/DataStructure/TopDownClosure.cpp Sat Sep 20 17:24:04 2003
@@ -21,16 +21,25 @@
Statistic<> NumTDInlines("tddatastructures", "Number of graphs inlined");
}
-/// FunctionHasCompleteArguments - This function returns true if it is safe not
-/// to mark arguments to the function complete.
-///
-/// FIXME: Need to check if all callers have been found, or rather if a
-/// funcpointer escapes!
-///
-static bool FunctionHasCompleteArguments(Function &F) {
- return F.hasInternalLinkage();
+void TDDataStructures::markReachableFunctionsExternallyAccessible(DSNode *N,
+ hash_set<DSNode*> &Visited) {
+ if (Visited.count(N)) return;
+ Visited.insert(N);
+
+ for (unsigned i = 0, e = N->getNumLinks(); i != e; ++i) {
+ DSNodeHandle &NH = N->getLink(i*N->getPointerSize());
+ if (DSNode *NN = NH.getNode()) {
+ const std::vector<GlobalValue*> &Globals = NN->getGlobals();
+ for (unsigned G = 0, e = Globals.size(); G != e; ++G)
+ if (Function *F = dyn_cast<Function>(Globals[G]))
+ ArgsRemainIncomplete.insert(F);
+
+ markReachableFunctionsExternallyAccessible(NN, Visited);
+ }
+ }
}
+
// run - Calculate the top down data structure graphs for each function in the
// program.
//
@@ -39,9 +48,20 @@
GlobalsGraph = new DSGraph(BU.getGlobalsGraph());
// Figure out which functions must not mark their arguments complete because
- // they are accessible outside this compilation unit.
+ // they are accessible outside this compilation unit. Currently, these
+ // arguments are functions which are reachable by global variables in the
+ // globals graph.
+ const DSGraph::ScalarMapTy &GGSM = GlobalsGraph->getScalarMap();
+ hash_set<DSNode*> Visited;
+ for (DSGraph::ScalarMapTy::const_iterator I = GGSM.begin(), E = GGSM.end();
+ I != E; ++I)
+ if (isa<GlobalValue>(I->first))
+ markReachableFunctionsExternallyAccessible(I->second.getNode(), Visited);
+ Visited.clear();
+
+ // Functions without internal linkage also have unknown incoming arguments!
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
- if (!FunctionHasCompleteArguments(*I))
+ if (!I->isExternal() && !I->hasInternalLinkage())
ArgsRemainIncomplete.insert(I);
// We want to traverse the call graph in reverse post-order. To do this, we
More information about the llvm-commits
mailing list