For PR780:
[oota-llvm.git] / lib / VMCore / Pass.cpp
index 4ed7847567798c1fe668002f1ae0a4c3c645723c..a7160f1f1ee85652460d674b5152fcdf8557f0c2 100644 (file)
@@ -23,9 +23,6 @@
 #include <set>
 using namespace llvm;
 
-// IncludeFile - Stub function used to help linking out.
-IncludeFile::IncludeFile(void*) {}
-
 //===----------------------------------------------------------------------===//
 //   AnalysisID Class Implementation
 //
@@ -38,13 +35,15 @@ static std::vector<const PassInfo*> &getCFGOnlyAnalyses() {
 }
 
 void RegisterPassBase::setOnlyUsesCFG() {
-  getCFGOnlyAnalyses().push_back(PIObj);
+  getCFGOnlyAnalyses().push_back(&PIObj);
 }
 
 //===----------------------------------------------------------------------===//
 //   AnalysisResolver Class Implementation
 //
 
+AnalysisResolver::~AnalysisResolver() {
+}
 void AnalysisResolver::setAnalysisResolver(Pass *P, AnalysisResolver *AR) {
   assert(P->Resolver == 0 && "Pass already in a PassManager!");
   P->Resolver = AR;
@@ -76,7 +75,7 @@ void AnalysisUsage::setPreservesCFG() {
 // PassManager implementation - The PassManager class is a simple Pimpl class
 // that wraps the PassManagerT template.
 //
-PassManager::PassManager() : PM(new PassManagerT<Module>()) {}
+PassManager::PassManager() : PM(new ModulePassManager()) {}
 PassManager::~PassManager() { delete PM; }
 void PassManager::add(Pass *P) {
   ModulePass *MP = dynamic_cast<ModulePass*>(P);
@@ -91,7 +90,7 @@ bool PassManager::run(Module &M) { return PM->runOnModule(M); }
 // is like PassManager, but only deals in FunctionPasses.
 //
 FunctionPassManager::FunctionPassManager(ModuleProvider *P) :
-  PM(new PassManagerT<Function>()), MP(P) {}
+  PM(new FunctionPassManagerT()), MP(P) {}
 FunctionPassManager::~FunctionPassManager() { delete PM; }
 void FunctionPassManager::add(FunctionPass *P) { PM->add(P); }
 void FunctionPassManager::add(ImmutablePass *IP) { PM->add(IP); }
@@ -192,7 +191,7 @@ void PMDebug::PrintAnalysisSetInfo(unsigned Depth, const char *Msg,
 // Pass Implementation
 //
 
-void ModulePass::addToPassManager(PassManagerT<Module> *PM, AnalysisUsage &AU) {
+void ModulePass::addToPassManager(ModulePassManager *PM, AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
 
@@ -229,7 +228,7 @@ void Pass::dump() const {
 //===----------------------------------------------------------------------===//
 // ImmutablePass Implementation
 //
-void ImmutablePass::addToPassManager(PassManagerT<Module> *PM,
+void ImmutablePass::addToPassManager(ModulePassManager *PM, 
                                      AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
@@ -262,12 +261,12 @@ bool FunctionPass::run(Function &F) {
   return Changed | doFinalization(*F.getParent());
 }
 
-void FunctionPass::addToPassManager(PassManagerT<Module> *PM,
+void FunctionPass::addToPassManager(ModulePassManager *PM,
                                     AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
 
-void FunctionPass::addToPassManager(PassManagerT<Function> *PM,
+void FunctionPass::addToPassManager(FunctionPassManagerT *PM,
                                     AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
@@ -300,12 +299,12 @@ bool BasicBlockPass::runPass(BasicBlock &BB) {
   return Changed;
 }
 
-void BasicBlockPass::addToPassManager(PassManagerT<Function> *PM,
+void BasicBlockPass::addToPassManager(FunctionPassManagerT *PM,
                                       AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
 
-void BasicBlockPass::addToPassManager(PassManagerT<BasicBlock> *PM,
+void BasicBlockPass::addToPassManager(BasicBlockPassManager *PM,
                                       AnalysisUsage &AU) {
   PM->addPass(this, AU);
 }
@@ -330,26 +329,25 @@ const PassInfo *Pass::lookupPassInfo(const std::type_info &TI) {
   return (I != PassInfoMap->end()) ? I->second : 0;
 }
 
-void RegisterPassBase::registerPass(PassInfo *PI) {
+void RegisterPassBase::registerPass() {
   if (PassInfoMap == 0)
     PassInfoMap = new std::map<TypeInfo, PassInfo*>();
 
-  assert(PassInfoMap->find(PI->getTypeInfo()) == PassInfoMap->end() &&
+  assert(PassInfoMap->find(PIObj.getTypeInfo()) == PassInfoMap->end() &&
          "Pass already registered!");
-  PIObj = PI;
-  PassInfoMap->insert(std::make_pair(TypeInfo(PI->getTypeInfo()), PI));
+  PassInfoMap->insert(std::make_pair(TypeInfo(PIObj.getTypeInfo()), &PIObj));
 
   // Notify any listeners...
   if (Listeners)
     for (std::vector<PassRegistrationListener*>::iterator
            I = Listeners->begin(), E = Listeners->end(); I != E; ++I)
-      (*I)->passRegistered(PI);
+      (*I)->passRegistered(&PIObj);
 }
 
-void RegisterPassBase::unregisterPass(PassInfo *PI) {
+void RegisterPassBase::unregisterPass() {
   assert(PassInfoMap && "Pass registered but not in map!");
   std::map<TypeInfo, PassInfo*>::iterator I =
-    PassInfoMap->find(PI->getTypeInfo());
+    PassInfoMap->find(PIObj.getTypeInfo());
   assert(I != PassInfoMap->end() && "Pass registered but not in map!");
 
   // Remove pass from the map...
@@ -363,10 +361,7 @@ void RegisterPassBase::unregisterPass(PassInfo *PI) {
   if (Listeners)
     for (std::vector<PassRegistrationListener*>::iterator
            I = Listeners->begin(), E = Listeners->end(); I != E; ++I)
-      (*I)->passUnregistered(PI);
-
-  // Delete the PassInfo object itself...
-  delete PI;
+      (*I)->passUnregistered(&PIObj);
 }
 
 //===----------------------------------------------------------------------===//
@@ -385,14 +380,14 @@ static std::map<const PassInfo *, AnalysisGroupInfo> *AnalysisGroupInfoMap = 0;
 //
 RegisterAGBase::RegisterAGBase(const std::type_info &Interface,
                                const std::type_info *Pass, bool isDefault)
-  : ImplementationInfo(0), isDefaultImplementation(isDefault) {
+  : RegisterPassBase(Interface, PassInfo::AnalysisGroup),
+    ImplementationInfo(0), isDefaultImplementation(isDefault) {
 
   InterfaceInfo = const_cast<PassInfo*>(Pass::lookupPassInfo(Interface));
-  if (InterfaceInfo == 0) {   // First reference to Interface, add it now.
-    InterfaceInfo =   // Create the new PassInfo for the interface...
-      new PassInfo("", "", Interface, PassInfo::AnalysisGroup, 0, 0);
-    registerPass(InterfaceInfo);
-    PIObj = 0;
+  if (InterfaceInfo == 0) {
+    // First reference to Interface, register it now.
+    registerPass();
+    InterfaceInfo = &PIObj;
   }
   assert(InterfaceInfo->getPassType() == PassInfo::AnalysisGroup &&
          "Trying to join an analysis group that is a normal pass!");
@@ -453,10 +448,11 @@ RegisterAGBase::~RegisterAGBase() {
         delete AnalysisGroupInfoMap;
         AnalysisGroupInfoMap = 0;
       }
-
-      unregisterPass(InterfaceInfo);
     }
   }
+  
+  if (InterfaceInfo == &PIObj)
+    unregisterPass();
 }
 
 
@@ -494,3 +490,4 @@ void PassRegistrationListener::enumeratePasses() {
            E = PassInfoMap->end(); I != E; ++I)
       passEnumerate(I->second);
 }
+