Change PMTopLevelManager's PassManagers vector element type from
authorDan Gohman <gohman@apple.com>
Thu, 13 Mar 2008 01:48:32 +0000 (01:48 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 13 Mar 2008 01:48:32 +0000 (01:48 +0000)
Pass* to PMDataManager*. PMDataManager is more specific than Pass,
so this more accurately describes the objects that are being stored.

This eliminates the need for several dynamic_casts to PMDataManager*.
It does introduce one dynamic_cast though, in dumpPasses(). Give
this one a comment describing why a dynamic_cast is being used.

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

include/llvm/PassManagers.h
lib/VMCore/PassManager.cpp

index 44c932a0c60f05d7660a2a569caaca4ac3753bc6..eaa6f442709d2e64f9627c494945ad6f9caca64f 100644 (file)
@@ -150,7 +150,7 @@ public:
     return ImmutablePasses;
   }
 
-  void addPassManager(Pass *Manager) {
+  void addPassManager(PMDataManager *Manager) {
     PassManagers.push_back(Manager);
   }
 
@@ -172,7 +172,7 @@ public:
 protected:
   
   /// Collection of pass managers
-  std::vector<Pass *> PassManagers;
+  std::vector<PMDataManager *> PassManagers;
 
 private:
 
index 275e0aea3fe96818407d81f0c040282cb9180b80..614ace315869746fe503516899fbf57a6f81e353 100644 (file)
@@ -455,10 +455,9 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
 
   Pass *P = NULL;
   // Check pass managers
-  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
+  for (std::vector<PMDataManager *>::iterator I = PassManagers.begin(),
          E = PassManagers.end(); P == NULL && I != E; ++I) {
-    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
-    assert(PMD && "This is not a PassManager");
+    PMDataManager *PMD = *I;
     P = PMD->findAnalysisPass(AID, false);
   }
 
@@ -496,9 +495,13 @@ void PMTopLevelManager::dumpPasses() const {
     ImmutablePasses[i]->dumpPassStructure(0);
   }
   
-  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
+  // Every class that derives from PMDataManager also derives from Pass
+  // (sometimes indirectly), but there's no inheritance relationship
+  // between PMDataManager and Pass, so we have to dynamic_cast to get
+  // from a PMDataManager* to a Pass*.
+  for (std::vector<PMDataManager *>::const_iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I)
-    (*I)->dumpPassStructure(1);
+    dynamic_cast<Pass *>(*I)->dumpPassStructure(1);
 }
 
 void PMTopLevelManager::dumpArguments() const {
@@ -507,10 +510,9 @@ void PMTopLevelManager::dumpArguments() const {
     return;
 
   cerr << "Pass Arguments: ";
-  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
+  for (std::vector<PMDataManager *>::const_iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I) {
-    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
-    assert(PMD && "This is not a PassManager");
+    PMDataManager *PMD = *I;
     PMD->dumpPassArguments();
   }
   cerr << "\n";
@@ -518,10 +520,9 @@ void PMTopLevelManager::dumpArguments() const {
 
 void PMTopLevelManager::initializeAllAnalysisInfo() {
   
-  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
+  for (std::vector<PMDataManager *>::iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I) {
-    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
-    assert(PMD && "This is not a PassManager");
+    PMDataManager *PMD = *I;
     PMD->initializeAnalysisInfo();
   }
   
@@ -533,7 +534,7 @@ void PMTopLevelManager::initializeAllAnalysisInfo() {
 
 /// Destructor
 PMTopLevelManager::~PMTopLevelManager() {
-  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
+  for (std::vector<PMDataManager *>::iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I)
     delete *I;