Use a ManagedCleanup to prevent leaking the PassRegistrar map. In breaks the
authorOwen Anderson <resistor@mac.com>
Tue, 6 Apr 2010 04:20:48 +0000 (04:20 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 6 Apr 2010 04:20:48 +0000 (04:20 +0000)
use case where someone wants to resurrect LLVM after calling llvm_shutdown,
but I'm not aware of any clients that are affected by this.

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

lib/VMCore/Pass.cpp

index 6093750124809f9775c61f5cdbbb718bcb5f03ba..6b941f34996e1e6c01c09ae70094164dfb26b272 100644 (file)
@@ -294,13 +294,8 @@ public:
 static std::vector<PassRegistrationListener*> *Listeners = 0;
 static sys::SmartMutex<true> ListenersLock;
 
-// FIXME: This should use ManagedStatic to manage the pass registrar.
-// Unfortunately, we can't do this, because passes are registered with static
-// ctors, and having llvm_shutdown clear this map prevents successful
-// ressurection after llvm_shutdown is run.
+static PassRegistrar *PassRegistrarObj = 0;
 static PassRegistrar *getPassRegistrar() {
-  static PassRegistrar *PassRegistrarObj = 0;
-  
   // Use double-checked locking to safely initialize the registrar when
   // we're running in multithreaded mode.
   PassRegistrar* tmp = PassRegistrarObj;
@@ -323,6 +318,19 @@ static PassRegistrar *getPassRegistrar() {
   return PassRegistrarObj;
 }
 
+// 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 cleanupPassRegistrar(void*) {
+  if (PassRegistrarObj) {
+    delete PassRegistrarObj;
+    PassRegistrarObj = 0;
+  }
+}
+ManagedCleanup<&cleanupPassRegistrar> registrarCleanup;
+
 // getPassInfo - Return the PassInfo data structure that corresponds to this
 // pass...
 const PassInfo *Pass::getPassInfo() const {