mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
Proivde getAnalysis<FPAnalysis>(Func) support.
llvm-svn: 36159
This commit is contained in:
parent
4bf452b5e4
commit
af0b4b4191
@ -196,9 +196,14 @@ public:
|
|||||||
template<typename AnalysisType>
|
template<typename AnalysisType>
|
||||||
AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h
|
AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h
|
||||||
|
|
||||||
|
template<typename AnalysisType>
|
||||||
|
AnalysisType &getAnalysis(Function &F); // Defined in PassanalysisSupport.h
|
||||||
|
|
||||||
template<typename AnalysisType>
|
template<typename AnalysisType>
|
||||||
AnalysisType &getAnalysisID(const PassInfo *PI) const;
|
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) {
|
inline std::ostream &operator<<(std::ostream &OS, const Pass &P) {
|
||||||
|
@ -127,6 +127,9 @@ public:
|
|||||||
return ResultPass;
|
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) {
|
void addAnalysisImplsPair(const PassInfo *PI, Pass *P) {
|
||||||
std::pair<const PassInfo*, Pass*> pir = std::make_pair(PI,P);
|
std::pair<const PassInfo*, Pass*> pir = std::make_pair(PI,P);
|
||||||
AnalysisImpls.push_back(pir);
|
AnalysisImpls.push_back(pir);
|
||||||
@ -197,6 +200,39 @@ AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const {
|
|||||||
return *Result;
|
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
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -906,6 +906,11 @@ Pass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const {
|
|||||||
return PM.findAnalysisPass(ID, dir);
|
return PM.findAnalysisPass(ID, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Pass *AnalysisResolver::findImplPass(Pass *P, const PassInfo *AnalysisPI,
|
||||||
|
Function &F) {
|
||||||
|
return PM.getOnTheFlyPass(P, AnalysisPI, F);
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// BBPassManager implementation
|
// BBPassManager implementation
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user