[llvm-commits] CVS: llvm/lib/VMCore/Pass.cpp

Chris Lattner sabre at nondot.org
Fri Dec 1 15:28:01 PST 2006



Changes in directory llvm/lib/VMCore:

Pass.cpp updated: 1.73 -> 1.74
---
Log message:

Start moving pass registration over to using the ManagedStatic mechanism.
This fixes issues where passes get unregistered before llvm_shutdown is 
called, and is generally cleaner and simpler.  Analysis groups up next.


---
Diffs of the changes:  (+52 -39)

 Pass.cpp |   91 ++++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 52 insertions(+), 39 deletions(-)


Index: llvm/lib/VMCore/Pass.cpp
diff -u llvm/lib/VMCore/Pass.cpp:1.73 llvm/lib/VMCore/Pass.cpp:1.74
--- llvm/lib/VMCore/Pass.cpp:1.73	Fri Dec  1 16:21:11 2006
+++ llvm/lib/VMCore/Pass.cpp	Fri Dec  1 17:27:45 2006
@@ -18,6 +18,7 @@
 #include "llvm/Module.h"
 #include "llvm/ModuleProvider.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/TypeInfo.h"
 #include <iostream>
 #include <set>
@@ -285,7 +286,39 @@
 //===----------------------------------------------------------------------===//
 // Pass Registration mechanism
 //
-static std::map<TypeInfo, PassInfo*> *PassInfoMap = 0;
+class PassRegistrar {
+  std::map<TypeInfo, PassInfo*> PassInfoMap;
+public:
+  
+  const PassInfo *GetPassInfo(const std::type_info &TI) const {
+    std::map<TypeInfo, PassInfo*>::const_iterator I = PassInfoMap.find(TI);
+    return I != PassInfoMap.end() ? I->second : 0;
+  }
+  
+  void RegisterPass(PassInfo &PI) {
+    bool Inserted =
+      PassInfoMap.insert(std::make_pair(TypeInfo(PI.getTypeInfo()),&PI)).second;
+    assert(Inserted && "Pass registered multiple times!");
+  }
+  
+  void UnregisterPass(PassInfo &PI) {
+    std::map<TypeInfo, PassInfo*>::iterator I =
+      PassInfoMap.find(PI.getTypeInfo());
+    assert(I != PassInfoMap.end() && "Pass registered but not in map!");
+    
+    // Remove pass from the map.
+    PassInfoMap.erase(I);
+  }
+  
+  void EnumerateWith(PassRegistrationListener *L) {
+    for (std::map<TypeInfo, PassInfo*>::const_iterator I = PassInfoMap.begin(),
+         E = PassInfoMap.end(); I != E; ++I)
+      L->passEnumerate(I->second);
+  }
+};
+
+
+static ManagedStatic<PassRegistrar> PassRegistrarObj;
 static std::vector<PassRegistrationListener*> *Listeners = 0;
 
 // getPassInfo - Return the PassInfo data structure that corresponds to this
@@ -296,20 +329,13 @@
 }
 
 const PassInfo *Pass::lookupPassInfo(const std::type_info &TI) {
-  if (PassInfoMap == 0) return 0;
-  std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->find(TI);
-  return (I != PassInfoMap->end()) ? I->second : 0;
+  return PassRegistrarObj->GetPassInfo(TI);
 }
 
 void RegisterPassBase::registerPass() {
-  if (PassInfoMap == 0)
-    PassInfoMap = new std::map<TypeInfo, PassInfo*>();
+  PassRegistrarObj->RegisterPass(PIObj);
 
-  assert(PassInfoMap->find(PIObj.getTypeInfo()) == PassInfoMap->end() &&
-         "Pass already registered!");
-  PassInfoMap->insert(std::make_pair(TypeInfo(PIObj.getTypeInfo()), &PIObj));
-
-  // Notify any listeners...
+  // Notify any listeners.
   if (Listeners)
     for (std::vector<PassRegistrationListener*>::iterator
            I = Listeners->begin(), E = Listeners->end(); I != E; ++I)
@@ -317,23 +343,7 @@
 }
 
 void RegisterPassBase::unregisterPass() {
-  assert(PassInfoMap && "Pass registered but not in map!");
-  std::map<TypeInfo, PassInfo*>::iterator I =
-    PassInfoMap->find(PIObj.getTypeInfo());
-  assert(I != PassInfoMap->end() && "Pass registered but not in map!");
-
-  // Remove pass from the map...
-  PassInfoMap->erase(I);
-  if (PassInfoMap->empty()) {
-    delete PassInfoMap;
-    PassInfoMap = 0;
-  }
-
-  // Notify any listeners...
-  if (Listeners)
-    for (std::vector<PassRegistrationListener*>::iterator
-           I = Listeners->begin(), E = Listeners->end(); I != E; ++I)
-      (*I)->passUnregistered(&PIObj);
+  PassRegistrarObj->UnregisterPass(PIObj);
 }
 
 //===----------------------------------------------------------------------===//
@@ -457,16 +467,25 @@
 // passEnumerate callback on each PassInfo object.
 //
 void PassRegistrationListener::enumeratePasses() {
-  if (PassInfoMap)
-    for (std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->begin(),
-           E = PassInfoMap->end(); I != E; ++I)
-      passEnumerate(I->second);
+  PassRegistrarObj->EnumerateWith(this);
 }
 
 //===----------------------------------------------------------------------===//
 //   AnalysisUsage Class Implementation
 //
 
+namespace {
+  struct GetCFGOnlyPasses : public PassRegistrationListener {
+    std::vector<AnalysisID> &CFGOnlyList;
+    GetCFGOnlyPasses(std::vector<AnalysisID> &L) : CFGOnlyList(L) {}
+    
+    void passEnumerate(const PassInfo *P) {
+      if (P->isCFGOnlyPass())
+        CFGOnlyList.push_back(P);
+    }
+  };
+}
+
 // setPreservesCFG - This function should be called to by the pass, iff they do
 // not:
 //
@@ -479,13 +498,7 @@
 void AnalysisUsage::setPreservesCFG() {
   // Since this transformation doesn't modify the CFG, it preserves all analyses
   // that only depend on the CFG (like dominators, loop info, etc...)
-  //
-  if (PassInfoMap) {
-    for (std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->begin(),
-             E = PassInfoMap->end(); I != E; ++I)
-      if (I->second->isCFGOnlyPass())
-        Preserved.push_back(I->second);
-  }
+  GetCFGOnlyPasses(Preserved).enumeratePasses();
 }
 
 






More information about the llvm-commits mailing list