From 2aafb917210ee11a5873428877ca397d5d7ea3a7 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 20 Jul 2010 21:22:24 +0000 Subject: [PATCH] Move more functionality from Pass.cpp to PassRegistry.cpp. This global will go away eventually, but for now we still need it around. llvm-svn: 108932 --- include/llvm/PassRegistry.h | 2 ++ lib/VMCore/Pass.cpp | 53 +++++-------------------------------- lib/VMCore/PassRegistry.cpp | 44 +++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/include/llvm/PassRegistry.h b/include/llvm/PassRegistry.h index 434dacbbfd7..1f627d8bfca 100644 --- a/include/llvm/PassRegistry.h +++ b/include/llvm/PassRegistry.h @@ -46,6 +46,8 @@ class PassRegistry { std::map AnalysisGroupInfoMap; public: + static PassRegistry *getPassRegistry(); + const PassInfo *getPassInfo(intptr_t TI) const; const PassInfo *getPassInfo(StringRef Arg) const; diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 4b19e53d4c9..255be38cd6d 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -241,47 +241,6 @@ PassManagerType BasicBlockPass::getPotentialPassManagerType() const { static std::vector *Listeners = 0; static sys::SmartMutex 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 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(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() {} diff --git a/lib/VMCore/PassRegistry.cpp b/lib/VMCore/PassRegistry.cpp index 178565ef02a..18a8cca56fc 100644 --- a/lib/VMCore/PassRegistry.cpp +++ b/lib/VMCore/PassRegistry.cpp @@ -13,7 +13,49 @@ //===----------------------------------------------------------------------===// #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 Guard(Lock);