Fix a bug that prevented the JIT from working correctly after llvm_shutdown.
authorChris Lattner <sabre@nondot.org>
Sat, 21 Apr 2007 00:12:18 +0000 (00:12 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 21 Apr 2007 00:12:18 +0000 (00:12 +0000)
Pass info objects are initialized by static ctors, so deleting them at
llvm_shutdown time prevents resurrection from working.

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

lib/VMCore/Pass.cpp

index b593d475ca0efe3119cb0edf5b5779d1f57a4de4..be49ae41a183c3a71630006c16431951707eef7d 100644 (file)
@@ -189,9 +189,19 @@ public:
 };
 }
 
-static ManagedStatic<PassRegistrar> PassRegistrarObj;
 static std::vector<PassRegistrationListener*> *Listeners = 0;
 
+// 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 *getPassRegistrar() {
+  static PassRegistrar *PassRegistrarObj = 0;
+  if (!PassRegistrarObj)
+    PassRegistrarObj = new PassRegistrar();
+  return PassRegistrarObj;
+}
+
 // getPassInfo - Return the PassInfo data structure that corresponds to this
 // pass...
 const PassInfo *Pass::getPassInfo() const {
@@ -200,11 +210,11 @@ const PassInfo *Pass::getPassInfo() const {
 }
 
 const PassInfo *Pass::lookupPassInfo(const std::type_info &TI) {
-  return PassRegistrarObj->GetPassInfo(TI);
+  return getPassRegistrar()->GetPassInfo(TI);
 }
 
 void RegisterPassBase::registerPass() {
-  PassRegistrarObj->RegisterPass(PIObj);
+  getPassRegistrar()->RegisterPass(PIObj);
 
   // Notify any listeners.
   if (Listeners)
@@ -214,7 +224,7 @@ void RegisterPassBase::registerPass() {
 }
 
 void RegisterPassBase::unregisterPass() {
-  PassRegistrarObj->UnregisterPass(PIObj);
+  getPassRegistrar()->UnregisterPass(PIObj);
 }
 
 //===----------------------------------------------------------------------===//
@@ -247,7 +257,7 @@ RegisterAGBase::RegisterAGBase(const std::type_info &Interface,
     PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
     IIPI->addInterfaceImplemented(InterfaceInfo);
     
-    PassRegistrarObj->RegisterAnalysisGroup(InterfaceInfo, IIPI, isDefault);
+    getPassRegistrar()->RegisterAnalysisGroup(InterfaceInfo, IIPI, isDefault);
   }
 }
 
@@ -286,7 +296,7 @@ PassRegistrationListener::~PassRegistrationListener() {
 // passEnumerate callback on each PassInfo object.
 //
 void PassRegistrationListener::enumeratePasses() {
-  PassRegistrarObj->EnumerateWith(this);
+  getPassRegistrar()->EnumerateWith(this);
 }
 
 //===----------------------------------------------------------------------===//