diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h
index 9f4e963..f4c6eed 100644
--- a/include/llvm/Pass.h
+++ b/include/llvm/Pass.h
@@ -163,7 +163,7 @@
   virtual void verifyAnalysis() const;
 
   // dumpPassStructure - Implement the -debug-passes=PassStructure option
-  void dumpPass(unsigned Offset = 0);
+  virtual void dumpPassStructure(unsigned Offset = 0);
 
   // lookupPassInfo - Return the pass info object for the specified pass class,
   // or null if it is not known.
diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h
index e324184..17f4a05 100644
--- a/include/llvm/PassManagers.h
+++ b/include/llvm/PassManagers.h
@@ -362,9 +362,6 @@
       InheritedAnalysis[Index++] = (*I)->getAvailableAnalysis();
   }
 
-  /// dumpPassStructure - Implement the -debug-passes=PassStructure option.
-  virtual void dumpPassStructure(unsigned Offset) = 0;
-
 protected:
 
   // Top level manager.
diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp
index 1063190..b7a27cb 100644
--- a/lib/Analysis/IPA/CallGraphSCCPass.cpp
+++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp
@@ -73,7 +73,7 @@
     errs().indent(Offset*2) << "Call Graph SCC Pass Manager\n";
     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
       Pass *P = getContainedPass(Index);
-      P->dumpPass(Offset + 1);
+      P->dumpPassStructure(Offset + 1);
       dumpLastUses(P, Offset+1);
     }
   }
diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp
index 718b615..15d4db8 100644
--- a/lib/Analysis/LoopPass.cpp
+++ b/lib/Analysis/LoopPass.cpp
@@ -332,7 +332,7 @@
   errs().indent(Offset*2) << "Loop Pass Manager\n";
   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
     Pass *P = getContainedPass(Index);
-    P->dumpPass(Offset + 1);
+    P->dumpPassStructure(Offset + 1);
     dumpLastUses(P, Offset+1);
   }
 }
diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp
index 9995d1d..a7d7f61 100644
--- a/lib/VMCore/Pass.cpp
+++ b/lib/VMCore/Pass.cpp
@@ -48,8 +48,8 @@
   return Resolver->getAnalysisIfAvailable(&AID, true) != 0;
 }
 
-// dumpPass - Implement the -debug-passes=Structure option
-void Pass::dumpPass(unsigned Offset) {
+// dumpPassStructure - Implement the -debug-passes=Structure option
+void Pass::dumpPassStructure(unsigned Offset) {
   dbgs().indent(Offset*2) << getPassName() << "\n";
 }
 
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 14c9174..ab4d4e5 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -192,7 +192,7 @@
     llvm::dbgs() << std::string(Offset*2, ' ') << "BasicBlockPass Manager\n";
     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
       BasicBlockPass *BP = getContainedPass(Index);
-      BP->dumpPass(Offset + 1);
+      BP->dumpPassStructure(Offset + 1);
       dumpLastUses(BP, Offset+1);
     }
   }
@@ -286,11 +286,6 @@
     FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
     return FP;
   }
-
-  /// dumpPassStructure - Implement the -debug-passes=PassStructure option.
-  void dumpPassStructure(unsigned) {
-    llvm_unreachable("dumpPassStructure called on FunctionPassManagerImpl");
-  }
 };
 
 char FunctionPassManagerImpl::ID = 0;
@@ -353,7 +348,7 @@
     llvm::dbgs() << std::string(Offset*2, ' ') << "ModulePass Manager\n";
     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
       ModulePass *MP = getContainedPass(Index);
-      MP->dumpPass(Offset + 1);
+      MP->dumpPassStructure(Offset + 1);
       std::map<Pass *, FunctionPassManagerImpl *>::const_iterator I =
         OnTheFlyManagers.find(MP);
       if (I != OnTheFlyManagers.end())
@@ -437,11 +432,6 @@
     MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
     return MP;
   }
-
-  /// dumpPassStructure - Implement the -debug-passes=PassStructure option.
-  void dumpPassStructure(unsigned) {
-    llvm_unreachable("dumpPassStructure called on PassManagerImpl");
-  }
 };
 
 char PassManagerImpl::ID = 0;
@@ -667,14 +657,16 @@
 
   // Print out the immutable passes
   for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
-    ImmutablePasses[i]->dumpPass();
+    ImmutablePasses[i]->dumpPassStructure(0);
   }
 
-  // Print out the normal passes. We add an extra layer of indentation here
-  // to help distinguish them visually from the immutable passes.
+  // 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 getAsPass to get
+  // from a PMDataManager* to a Pass*.
   for (SmallVector<PMDataManager *, 8>::const_iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I)
-    (*I)->dumpPassStructure(1);
+    (*I)->getAsPass()->dumpPassStructure(1);
 }
 
 void PMTopLevelManager::dumpArguments() const {
@@ -1049,7 +1041,7 @@
   for (SmallVector<Pass *, 12>::iterator I = LUses.begin(),
          E = LUses.end(); I != E; ++I) {
     llvm::dbgs() << "--" << std::string(Offset*2, ' ');
-    (*I)->dumpPass(0);
+    (*I)->dumpPassStructure(0);
   }
 }
 
@@ -1417,7 +1409,7 @@
   llvm::dbgs() << std::string(Offset*2, ' ') << "FunctionPass Manager\n";
   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
     FunctionPass *FP = getContainedPass(Index);
-    FP->dumpPass(Offset + 1);
+    FP->dumpPassStructure(Offset + 1);
     dumpLastUses(FP, Offset+1);
   }
 }
