New method, PMDataManager::collectRequiredAnalysisPasses()
authorDevang Patel <dpatel@apple.com>
Thu, 7 Dec 2006 23:05:44 +0000 (23:05 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 7 Dec 2006 23:05:44 +0000 (23:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32338 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/PassManager.cpp

index 76869fe46423ad59097611861234af6c6a4b93d9..99e7bc58728380daab9e8835c36d5b0067c078da 100644 (file)
@@ -241,7 +241,7 @@ public:
   /// AvailableAnalysis appropriately if ProcessAnalysis is true.
   void addPassToManager (Pass *P, bool ProcessAnalysis = true);
 
-  // Initialize available analysis information.
+  /// Initialize available analysis information.
   void initializeAnalysisInfo() { 
     AvailableAnalysis.clear();
 
@@ -252,12 +252,16 @@ public:
       recordAvailableAnalysis(*I);
   }
 
-  // All Required analyses should be available to the pass as it runs!  Here
-  // we fill in the AnalysisImpls member of the pass so that it can
-  // successfully use the getAnalysis() method to retrieve the
-  // implementations it needs.
-  //
- void initializeAnalysisImpl(Pass *P);
+  /// Populate RequiredPasses with the analysis pass that are required by
+  /// pass P.
+  void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses,
+                                     Pass *P);
+
+  /// All Required analyses should be available to the pass as it runs!  Here
+  /// we fill in the AnalysisImpls member of the pass so that it can
+  /// successfully use the getAnalysis() method to retrieve the
+  /// implementations it needs.
+  void initializeAnalysisImpl(Pass *P);
 
   inline std::vector<Pass *>::iterator passVectorBegin() { 
     return PassVector.begin(); 
@@ -520,6 +524,22 @@ void PMDataManager::addPassToManager(Pass *P,
   PassVector.push_back(P);
 }
 
+/// Populate RequiredPasses with the analysis pass that are required by
+/// pass P.
+void PMDataManager::collectRequiredAnalysisPasses(std::vector<Pass *> &RP,
+                                                  Pass *P) {
+  AnalysisUsage AnUsage;
+  P->getAnalysisUsage(AnUsage);
+  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
+  for (std::vector<AnalysisID>::const_iterator 
+         I = RequiredSet.begin(), E = RequiredSet.end();
+       I != E; ++I) {
+    Pass *AnalysisPass = NULL; //FIXME findAnalysisPass(*I,true);
+    assert (AnalysisPass && "Analysis pass is not available");
+    RP.push_back(AnalysisPass);
+  }
+}
+
 // All Required analyses should be available to the pass as it runs!  Here
 // we fill in the AnalysisImpls member of the pass so that it can
 // successfully use the getAnalysis() method to retrieve the