Proivde getAnalysis<FPAnalysis>(Func) support.
authorDevang Patel <dpatel@apple.com>
Mon, 16 Apr 2007 20:56:24 +0000 (20:56 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 16 Apr 2007 20:56:24 +0000 (20:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36159 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Pass.h
include/llvm/PassAnalysisSupport.h
lib/VMCore/PassManager.cpp

index cef45011cecea477e0dd183584f9924f862b310b..5dd3dba4c6e331d908d3adf283c1158691958a02 100644 (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) {
index 3234e91ebaccaaaef465fa8ed91fd175899d5390..75434a25ef2bbae96cdaf95222e0ad119fbbffc1 100644 (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
index 10e6e2fd8a45dffa127aa97fbc2da5aa05638847..97cd380cef0399f23020548d4ed017f77b5236ba 100644 (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