diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-09-20 23:58:33 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-09-20 23:58:33 +0000 | 
| commit | 3c095c79fa4fea9451a5dfb6e78074db709b932a (patch) | |
| tree | d3cdf46979e87199b92c6327c04619cb187fcf2f /llvm/lib | |
| parent | 413b7bde7c55ad09cf7fc708c101466c18b1eb24 (diff) | |
| download | bcm5719-llvm-3c095c79fa4fea9451a5dfb6e78074db709b932a.tar.gz bcm5719-llvm-3c095c79fa4fea9451a5dfb6e78074db709b932a.zip | |
Functions reachable from the arguments of unresolvable call nodes should
not have their arguments marked complete
llvm-svn: 8639
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Analysis/DataStructure/TopDownClosure.cpp | 14 | 
2 files changed, 17 insertions, 2 deletions
| diff --git a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp index 5019d908450..95de8e45e9b 100644 --- a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -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;  } diff --git a/llvm/lib/Analysis/DataStructure/TopDownClosure.cpp b/llvm/lib/Analysis/DataStructure/TopDownClosure.cpp index 1266e5ee097..7da1746125b 100644 --- a/llvm/lib/Analysis/DataStructure/TopDownClosure.cpp +++ b/llvm/lib/Analysis/DataStructure/TopDownClosure.cpp @@ -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! | 

