Move more functionality from Pass.cpp to PassRegistry.cpp. This global will go away...
authorOwen Anderson <resistor@mac.com>
Tue, 20 Jul 2010 21:22:24 +0000 (21:22 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 20 Jul 2010 21:22:24 +0000 (21:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108932 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/PassRegistry.h
lib/VMCore/Pass.cpp
lib/VMCore/PassRegistry.cpp

index 434dacbbfd7d72b350db8d93177feabd62aab21e..1f627d8bfca0ac648c3a028a2d37fb0a4f81b5d9 100644 (file)
@@ -46,6 +46,8 @@ class PassRegistry {
   std::map<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap;
 
 public:
+  static PassRegistry *getPassRegistry();
+  
   const PassInfo *getPassInfo(intptr_t TI) const;
   const PassInfo *getPassInfo(StringRef Arg) const;
   
index 4b19e53d4c989ae03511ee85eed8135a1f642d14..255be38cd6d4cd31c19f7bd031872b3c5d0f4798 100644 (file)
@@ -241,47 +241,6 @@ PassManagerType BasicBlockPass::getPotentialPassManagerType() const {
 static std::vector<PassRegistrationListener*> *Listeners = 0;
 static sys::SmartMutex<true> ListenersLock;
 
-static PassRegistry *PassRegistryObj = 0;
-static PassRegistry *getPassRegistry() {
-  // Use double-checked locking to safely initialize the registrar when
-  // we're running in multithreaded mode.
-  PassRegistry* tmp = PassRegistryObj;
-  if (llvm_is_multithreaded()) {
-    sys::MemoryFence();
-    if (!tmp) {
-      llvm_acquire_global_lock();
-      tmp = PassRegistryObj;
-      if (!tmp) {
-        tmp = new PassRegistry();
-        sys::MemoryFence();
-        PassRegistryObj = tmp;
-      }
-      llvm_release_global_lock();
-    }
-  } else if (!tmp) {
-    PassRegistryObj = new PassRegistry();
-  }
-  
-  return PassRegistryObj;
-}
-
-namespace {
-
-// FIXME: We use ManagedCleanup to erase the pass registrar on shutdown.
-// Unfortunately, passes are registered with static ctors, and having
-// llvm_shutdown clear this map prevents successful ressurection after 
-// llvm_shutdown is run.  Ideally we should find a solution so that we don't
-// leak the map, AND can still resurrect after shutdown.
-void cleanupPassRegistry(void*) {
-  if (PassRegistryObj) {
-    delete PassRegistryObj;
-    PassRegistryObj = 0;
-  }
-}
-ManagedCleanup<&cleanupPassRegistry> registryCleanup ATTRIBUTE_USED;
-
-}
-
 // getPassInfo - Return the PassInfo data structure that corresponds to this
 // pass...
 const PassInfo *Pass::getPassInfo() const {
@@ -289,15 +248,15 @@ const PassInfo *Pass::getPassInfo() const {
 }
 
 const PassInfo *Pass::lookupPassInfo(intptr_t TI) {
-  return getPassRegistry()->getPassInfo(TI);
+  return PassRegistry::getPassRegistry()->getPassInfo(TI);
 }
 
 const PassInfo *Pass::lookupPassInfo(StringRef Arg) {
-  return getPassRegistry()->getPassInfo(Arg);
+  return PassRegistry::getPassRegistry()->getPassInfo(Arg);
 }
 
 void PassInfo::registerPass() {
-  getPassRegistry()->registerPass(*this);
+  PassRegistry::getPassRegistry()->registerPass(*this);
 
   // Notify any listeners.
   sys::SmartScopedLock<true> Lock(ListenersLock);
@@ -308,7 +267,7 @@ void PassInfo::registerPass() {
 }
 
 void PassInfo::unregisterPass() {
-  getPassRegistry()->unregisterPass(*this);
+  PassRegistry::getPassRegistry()->unregisterPass(*this);
 }
 
 Pass *PassInfo::createPass() const {
@@ -349,7 +308,7 @@ RegisterAGBase::RegisterAGBase(const char *Name, intptr_t InterfaceID,
     PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
     IIPI->addInterfaceImplemented(InterfaceInfo);
     
-    getPassRegistry()->registerAnalysisGroup(InterfaceInfo, IIPI, isDefault);
+    PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceInfo, IIPI, isDefault);
   }
 }
 
@@ -385,7 +344,7 @@ PassRegistrationListener::~PassRegistrationListener() {
 // passEnumerate callback on each PassInfo object.
 //
 void PassRegistrationListener::enumeratePasses() {
-  getPassRegistry()->enumerateWith(this);
+  PassRegistry::getPassRegistry()->enumerateWith(this);
 }
 
 PassNameParser::~PassNameParser() {}
index 178565ef02ad4fcee5b9e87863bae6a001a2032c..18a8cca56fc7b7869826535e09b2403b6f26863c 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "llvm/PassRegistry.h"
-#include "llvm/System/Mutex.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/ManagedStatic.h"
+
+static PassRegistry *PassRegistryObj = 0;
+PassRegistry *PassRegistry::getPassRegistry() {
+  // Use double-checked locking to safely initialize the registrar when
+  // we're running in multithreaded mode.
+  PassRegistry* tmp = PassRegistryObj;
+  if (llvm_is_multithreaded()) {
+    sys::MemoryFence();
+    if (!tmp) {
+      llvm_acquire_global_lock();
+      tmp = PassRegistryObj;
+      if (!tmp) {
+        tmp = new PassRegistry();
+        sys::MemoryFence();
+        PassRegistryObj = tmp;
+      }
+      llvm_release_global_lock();
+    }
+  } else if (!tmp) {
+    PassRegistryObj = new PassRegistry();
+  }
+  
+  return PassRegistryObj;
+}
+
+namespace {
+
+// FIXME: We use ManagedCleanup to erase the pass registrar on shutdown.
+// Unfortunately, passes are registered with static ctors, and having
+// llvm_shutdown clear this map prevents successful ressurection after 
+// llvm_shutdown is run.  Ideally we should find a solution so that we don't
+// leak the map, AND can still resurrect after shutdown.
+void cleanupPassRegistry(void*) {
+  if (PassRegistryObj) {
+    delete PassRegistryObj;
+    PassRegistryObj = 0;
+  }
+}
+ManagedCleanup<&cleanupPassRegistry> registryCleanup ATTRIBUTE_USED;
+
+}
 
 const PassInfo *PassRegistry::getPassInfo(intptr_t TI) const {
   sys::SmartScopedLock<true> Guard(Lock);