[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