Functions reachable from the arguments of unresolvable call nodes should
authorChris Lattner <sabre@nondot.org>
Sat, 20 Sep 2003 23:58:33 +0000 (23:58 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 20 Sep 2003 23:58:33 +0000 (23:58 +0000)
not have their arguments marked complete

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8639 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/BottomUpClosure.cpp
lib/Analysis/DataStructure/TopDownClosure.cpp

index 5019d90845069613c58b282fb781a0a119c416a7..95de8e45e9b6eba7119bf93f9e2451ce988c293d 100644 (file)
@@ -51,7 +51,10 @@ bool BUDataStructures::run(Module &M) {
 
   // At the end of the bottom-up pass, the globals graph becomes complete.
   // FIXME: This is not the right way to do this, but it is sorta better than
-  // nothing!
+  // nothing!  In particular, externally visible globals and unresolvable call
+  // nodes at the end of the BU phase should make things that they point to
+  // incomplete in the globals graph.
+  // 
   GlobalsGraph->maskIncompleteMarkers();
   return false;
 }
index 1266e5ee0973541294224d1fca3084e268374b70..7da1746125beb605b9fbad813da5f405a06a6344 100644 (file)
@@ -23,7 +23,7 @@ namespace {
 
 void TDDataStructures::markReachableFunctionsExternallyAccessible(DSNode *N,
                                                    hash_set<DSNode*> &Visited) {
-  if (Visited.count(N)) return;
+  if (!N || Visited.count(N)) return;
   Visited.insert(N);
 
   for (unsigned i = 0, e = N->getNumLinks(); i != e; ++i) {
@@ -46,6 +46,7 @@ void TDDataStructures::markReachableFunctionsExternallyAccessible(DSNode *N,
 bool TDDataStructures::run(Module &M) {
   BUDataStructures &BU = getAnalysis<BUDataStructures>();
   GlobalsGraph = new DSGraph(BU.getGlobalsGraph());
+  GlobalsGraph->setPrintAuxCalls();
 
   // Figure out which functions must not mark their arguments complete because
   // they are accessible outside this compilation unit.  Currently, these
@@ -57,6 +58,17 @@ bool TDDataStructures::run(Module &M) {
        I != E; ++I)
     if (isa<GlobalValue>(I->first))
       markReachableFunctionsExternallyAccessible(I->second.getNode(), Visited);
+
+  // Loop over unresolved call nodes.  Any functions passed into (but not
+  // returned!?) from unresolvable call nodes may be invoked outside of the
+  // current module.
+  const std::vector<DSCallSite> &Calls = GlobalsGraph->getAuxFunctionCalls();
+  for (unsigned i = 0, e = Calls.size(); i != e; ++i) {
+    const DSCallSite &CS = Calls[i];
+    for (unsigned arg = 0, e = CS.getNumPtrArgs(); arg != e; ++arg)
+      markReachableFunctionsExternallyAccessible(CS.getPtrArg(arg).getNode(),
+                                                 Visited);
+  }
   Visited.clear();
 
   // Functions without internal linkage also have unknown incoming arguments!