[llvm-commits] CVS: llvm/include/llvm/Pass.h PassAnalysisSupport.h
Devang Patel
dpatel at apple.com
Tue Dec 12 16:23:59 PST 2006
Changes in directory llvm/include/llvm:
Pass.h updated: 1.57 -> 1.58
PassAnalysisSupport.h updated: 1.23 -> 1.24
---
Log message:
Move getAnalysis() and getAnalysisID() definitions from Pass.h to
PassAnalysisSupport.h
---
Diffs of the changes: (+43 -33)
Pass.h | 36 +++---------------------------------
PassAnalysisSupport.h | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 33 deletions(-)
Index: llvm/include/llvm/Pass.h
diff -u llvm/include/llvm/Pass.h:1.57 llvm/include/llvm/Pass.h:1.58
--- llvm/include/llvm/Pass.h:1.57 Fri Dec 8 17:52:04 2006
+++ llvm/include/llvm/Pass.h Tue Dec 12 18:23:44 2006
@@ -173,41 +173,11 @@
/// getAnalysisUsage function.
///
template<typename AnalysisType>
- AnalysisType &getAnalysis() const {
- assert(Resolver && "Pass has not been inserted into a PassManager object!");
- const PassInfo *PI = getClassPassInfo<AnalysisType>();
- return getAnalysisID<AnalysisType>(PI);
- }
+ AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h
template<typename AnalysisType>
- AnalysisType &getAnalysisID(const PassInfo *PI) const {
- assert(Resolver && "Pass has not been inserted into a PassManager object!");
- assert(PI && "getAnalysis for unregistered pass!");
-
- // 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 = 0;
- for (unsigned i = 0; ; ++i) {
- assert(i != AnalysisImpls.size() &&
- "getAnalysis*() called on an analysis that was not "
- "'required' by pass!");
- if (AnalysisImpls[i].first == PI) {
- ResultPass = AnalysisImpls[i].second;
- break;
- }
- }
-
- // 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;
- }
-
+ AnalysisType &getAnalysisID(const PassInfo *PI) const;
+
private:
template<typename Trait> friend class PassManagerT;
friend class ModulePassManager;
Index: llvm/include/llvm/PassAnalysisSupport.h
diff -u llvm/include/llvm/PassAnalysisSupport.h:1.23 llvm/include/llvm/PassAnalysisSupport.h:1.24
--- llvm/include/llvm/PassAnalysisSupport.h:1.23 Fri Dec 8 17:28:54 2006
+++ llvm/include/llvm/PassAnalysisSupport.h Tue Dec 12 18:23:44 2006
@@ -195,6 +195,46 @@
return dynamic_cast<AnalysisType*>(Resolver->getAnalysisToUpdate(PI));
}
+/// 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() const {
+ assert(Resolver && "Pass has not been inserted into a PassManager object!");
+ const PassInfo *PI = getClassPassInfo<AnalysisType>();
+ return getAnalysisID<AnalysisType>(PI);
+}
+
+template<typename AnalysisType>
+AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const {
+ assert(Resolver && "Pass has not been inserted into a PassManager object!");
+ assert(PI && "getAnalysis for unregistered pass!");
+
+ // 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 = 0;
+ for (unsigned i = 0; ; ++i) {
+ assert(i != AnalysisImpls.size() &&
+ "getAnalysis*() called on an analysis that was not "
+ "'required' by pass!");
+ if (AnalysisImpls[i].first == PI) {
+ ResultPass = AnalysisImpls[i].second;
+ break;
+ }
+ }
+
+ // 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
More information about the llvm-commits
mailing list