mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Proivde getAnalysis<FPAnalysis>(Func) support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36159 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f4bd76a035
commit
6b1df0e863
@ -196,9 +196,14 @@ public:
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h
|
||||
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &getAnalysis(Function &F); // Defined in PassanalysisSupport.h
|
||||
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &getAnalysisID(const PassInfo *PI) const;
|
||||
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &getAnalysisID(const PassInfo *PI, Function &F);
|
||||
};
|
||||
|
||||
inline std::ostream &operator<<(std::ostream &OS, const Pass &P) {
|
||||
|
@ -127,6 +127,9 @@ public:
|
||||
return ResultPass;
|
||||
}
|
||||
|
||||
// Find pass that is implementing PI. Initialize pass for Function F.
|
||||
Pass *findImplPass(Pass *P, const PassInfo *PI, Function &F);
|
||||
|
||||
void addAnalysisImplsPair(const PassInfo *PI, Pass *P) {
|
||||
std::pair<const PassInfo*, Pass*> pir = std::make_pair(PI,P);
|
||||
AnalysisImpls.push_back(pir);
|
||||
@ -197,6 +200,39 @@ AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const {
|
||||
return *Result;
|
||||
}
|
||||
|
||||
/// getAnalysis<AnalysisType>() - This function is used by subclasses to get
|
||||
/// to the analysis information that they claim to use by overriding the
|
||||
/// getAnalysisUsage function.
|
||||
///
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &Pass::getAnalysis(Function &F) {
|
||||
assert(Resolver &&"Pass has not been inserted into a PassManager object!");
|
||||
|
||||
return getAnalysisID<AnalysisType>(getClassPassInfo<AnalysisType>(), F);
|
||||
}
|
||||
|
||||
template<typename AnalysisType>
|
||||
AnalysisType &Pass::getAnalysisID(const PassInfo *PI, Function &F) {
|
||||
assert(PI && "getAnalysis for unregistered pass!");
|
||||
assert(Resolver&&"Pass has not been inserted into a PassManager object!");
|
||||
// PI *must* appear in AnalysisImpls. Because the number of passes used
|
||||
// should be a small number, we just do a linear search over a (dense)
|
||||
// vector.
|
||||
Pass *ResultPass = Resolver->findImplPass(this, PI, F);
|
||||
assert (ResultPass &&
|
||||
"getAnalysis*() called on an analysis that was not "
|
||||
"'required' by pass!");
|
||||
|
||||
// Because the AnalysisType may not be a subclass of pass (for
|
||||
// AnalysisGroups), we must use dynamic_cast here to potentially adjust the
|
||||
// return pointer (because the class may multiply inherit, once from pass,
|
||||
// once from AnalysisType).
|
||||
//
|
||||
AnalysisType *Result = dynamic_cast<AnalysisType*>(ResultPass);
|
||||
assert(Result && "Pass does not implement interface required!");
|
||||
return *Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -906,6 +906,11 @@ Pass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const {
|
||||
return PM.findAnalysisPass(ID, dir);
|
||||
}
|
||||
|
||||
Pass *AnalysisResolver::findImplPass(Pass *P, const PassInfo *AnalysisPI,
|
||||
Function &F) {
|
||||
return PM.getOnTheFlyPass(P, AnalysisPI, F);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// BBPassManager implementation
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user