summaryrefslogtreecommitdiff
path: root/lib/VMCore
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-07-20 21:22:24 +0000
committerOwen Anderson <resistor@mac.com>2010-07-20 21:22:24 +0000
commitaac07eaeef0b29690f18061abc148a2608cd77de (patch)
tree0574003a37189ba73fb7d548177ff93b3b97eb6a /lib/VMCore
parentaad9c4cf67821eee981f8e7eb870b77c3727b26e (diff)
downloadllvm-aac07eaeef0b29690f18061abc148a2608cd77de.tar.gz
llvm-aac07eaeef0b29690f18061abc148a2608cd77de.tar.bz2
llvm-aac07eaeef0b29690f18061abc148a2608cd77de.tar.xz
Move more functionality from Pass.cpp to PassRegistry.cpp. This global will go away eventually, but for now we still need it around.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108932 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r--lib/VMCore/Pass.cpp53
-rw-r--r--lib/VMCore/PassRegistry.cpp44
2 files changed, 49 insertions, 48 deletions
diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp
index 4b19e53d4c..255be38cd6 100644
--- a/lib/VMCore/Pass.cpp
+++ b/lib/VMCore/Pass.cpp
@@ -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() {}
diff --git a/lib/VMCore/PassRegistry.cpp b/lib/VMCore/PassRegistry.cpp
index 178565ef02..18a8cca56f 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<true> Guard(Lock);