Move getAnalysis() and getAnalysisID() definitions from Pass.h to
authorDevang Patel <dpatel@apple.com>
Wed, 13 Dec 2006 00:23:44 +0000 (00:23 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 13 Dec 2006 00:23:44 +0000 (00:23 +0000)
PassAnalysisSupport.h

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32518 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Pass.h
include/llvm/PassAnalysisSupport.h

index 0ae94e3933374e751f40b1cf1c3283b07ff92eb4..fc13a3aec0fe62890afaf61ecd2eae5f21c68819 100644 (file)
@@ -173,41 +173,11 @@ public:
   /// 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 3ef43fdcb7f37798d2aa3ab7c4008621758d4558..d2aec0bbc9202b6578c3675c1c7836234c22c04a 100644 (file)
@@ -195,6 +195,46 @@ AnalysisType *Pass::getAnalysisToUpdate() const {
   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