mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Fix a nasty bug where the ConstantMerge pass was invalidating the TargetData pass
even though it was immutable. Immutable passes should never end up in CurrentAnalyses! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5906 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a148ccb158
commit
a172846d3a
@ -332,12 +332,32 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Pass *getImmutablePassOrNull(const PassInfo *ID) const {
|
||||||
|
for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
|
||||||
|
const PassInfo *IPID = ImmutablePasses[i]->getPassInfo();
|
||||||
|
if (IPID == ID)
|
||||||
|
return ImmutablePasses[i];
|
||||||
|
|
||||||
|
// This pass is the current implementation of all of the interfaces it
|
||||||
|
// implements as well.
|
||||||
|
//
|
||||||
|
const std::vector<const PassInfo*> &II =
|
||||||
|
IPID->getInterfacesImplemented();
|
||||||
|
for (unsigned j = 0, e = II.size(); j != e; ++j)
|
||||||
|
if (II[j] == ID) return ImmutablePasses[i];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Pass *getAnalysisOrNullDown(const PassInfo *ID) const {
|
Pass *getAnalysisOrNullDown(const PassInfo *ID) const {
|
||||||
std::map<AnalysisID, Pass*>::const_iterator I = CurrentAnalyses.find(ID);
|
std::map<AnalysisID, Pass*>::const_iterator I = CurrentAnalyses.find(ID);
|
||||||
|
|
||||||
if (I != CurrentAnalyses.end())
|
if (I != CurrentAnalyses.end())
|
||||||
return I->second; // Found it.
|
return I->second; // Found it.
|
||||||
|
|
||||||
|
if (Pass *P = getImmutablePassOrNull(ID))
|
||||||
|
return P;
|
||||||
|
|
||||||
if (Batcher)
|
if (Batcher)
|
||||||
return ((AnalysisResolver*)Batcher)->getAnalysisOrNullDown(ID);
|
return ((AnalysisResolver*)Batcher)->getAnalysisOrNullDown(ID);
|
||||||
return 0;
|
return 0;
|
||||||
@ -350,6 +370,8 @@ public:
|
|||||||
|
|
||||||
if (Parent) // Try scanning...
|
if (Parent) // Try scanning...
|
||||||
return Parent->getAnalysisOrNullUp(ID);
|
return Parent->getAnalysisOrNullUp(ID);
|
||||||
|
else if (!ImmutablePasses.empty())
|
||||||
|
return getImmutablePassOrNull(ID);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +408,9 @@ public:
|
|||||||
if (Parent) {
|
if (Parent) {
|
||||||
Parent->markPassUsed(P, this);
|
Parent->markPassUsed(P, this);
|
||||||
} else {
|
} else {
|
||||||
assert(0 && "Pass available but not found! "
|
assert(getAnalysisOrNullUp(P) &&
|
||||||
|
dynamic_cast<ImmutablePass*>(getAnalysisOrNullUp(P)) &&
|
||||||
|
"Pass available but not found! "
|
||||||
"Perhaps this is a module pass requiring a function pass?");
|
"Perhaps this is a module pass requiring a function pass?");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -556,18 +580,6 @@ public:
|
|||||||
|
|
||||||
// Initialize the immutable pass...
|
// Initialize the immutable pass...
|
||||||
IP->initializePass();
|
IP->initializePass();
|
||||||
|
|
||||||
// Add this pass to the currently available set...
|
|
||||||
if (const PassInfo *PI = IP->getPassInfo()) {
|
|
||||||
CurrentAnalyses[PI] = IP;
|
|
||||||
|
|
||||||
// This pass is the current implementation of all of the interfaces it
|
|
||||||
// implements as well.
|
|
||||||
//
|
|
||||||
const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
|
|
||||||
for (unsigned i = 0, e = II.size(); i != e; ++i)
|
|
||||||
CurrentAnalyses[II[i]] = IP;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user