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:
Devang Patel 2007-04-16 20:56:24 +00:00
parent f4bd76a035
commit 6b1df0e863
3 changed files with 46 additions and 0 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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