mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 01:12:59 +00:00
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
This commit is contained in:
parent
ec157b7cde
commit
11fc9301fb
@ -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;
|
||||
}
|
||||
|
@ -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!
|
||||
|
Loading…
Reference in New Issue
Block a user