aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-09-20 23:58:33 +0000
committerChris Lattner <sabre@nondot.org>2003-09-20 23:58:33 +0000
commit11fc9301fbe7597aa5be1940b014fbbd85732a56 (patch)
tree787d2bbcc231684ab761d8d9d350397a9d04a35e
parentec157b7cde458d99440a1b07e5ac904a503da7b6 (diff)
downloadexternal_llvm-11fc9301fbe7597aa5be1940b014fbbd85732a56.zip
external_llvm-11fc9301fbe7597aa5be1940b014fbbd85732a56.tar.gz
external_llvm-11fc9301fbe7597aa5be1940b014fbbd85732a56.tar.bz2
Functions reachable from the arguments of unresolvable call nodes should
not have their arguments marked complete git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8639 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/DataStructure/BottomUpClosure.cpp5
-rw-r--r--lib/Analysis/DataStructure/TopDownClosure.cpp14
2 files changed, 17 insertions, 2 deletions
diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp
index 5019d90..95de8e4 100644
--- a/lib/Analysis/DataStructure/BottomUpClosure.cpp
+++ b/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/lib/Analysis/DataStructure/TopDownClosure.cpp b/lib/Analysis/DataStructure/TopDownClosure.cpp
index 1266e5e..7da1746 100644
--- a/lib/Analysis/DataStructure/TopDownClosure.cpp
+++ b/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!