mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
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
This commit is contained in:
parent
2da8b36e05
commit
2aafb91721
@ -46,6 +46,8 @@ class PassRegistry {
|
|||||||
std::map<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap;
|
std::map<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static PassRegistry *getPassRegistry();
|
||||||
|
|
||||||
const PassInfo *getPassInfo(intptr_t TI) const;
|
const PassInfo *getPassInfo(intptr_t TI) const;
|
||||||
const PassInfo *getPassInfo(StringRef Arg) const;
|
const PassInfo *getPassInfo(StringRef Arg) const;
|
||||||
|
|
||||||
|
@ -241,47 +241,6 @@ PassManagerType BasicBlockPass::getPotentialPassManagerType() const {
|
|||||||
static std::vector<PassRegistrationListener*> *Listeners = 0;
|
static std::vector<PassRegistrationListener*> *Listeners = 0;
|
||||||
static sys::SmartMutex<true> ListenersLock;
|
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
|
// getPassInfo - Return the PassInfo data structure that corresponds to this
|
||||||
// pass...
|
// pass...
|
||||||
const PassInfo *Pass::getPassInfo() const {
|
const PassInfo *Pass::getPassInfo() const {
|
||||||
@ -289,15 +248,15 @@ const PassInfo *Pass::getPassInfo() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const PassInfo *Pass::lookupPassInfo(intptr_t TI) {
|
const PassInfo *Pass::lookupPassInfo(intptr_t TI) {
|
||||||
return getPassRegistry()->getPassInfo(TI);
|
return PassRegistry::getPassRegistry()->getPassInfo(TI);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PassInfo *Pass::lookupPassInfo(StringRef Arg) {
|
const PassInfo *Pass::lookupPassInfo(StringRef Arg) {
|
||||||
return getPassRegistry()->getPassInfo(Arg);
|
return PassRegistry::getPassRegistry()->getPassInfo(Arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PassInfo::registerPass() {
|
void PassInfo::registerPass() {
|
||||||
getPassRegistry()->registerPass(*this);
|
PassRegistry::getPassRegistry()->registerPass(*this);
|
||||||
|
|
||||||
// Notify any listeners.
|
// Notify any listeners.
|
||||||
sys::SmartScopedLock<true> Lock(ListenersLock);
|
sys::SmartScopedLock<true> Lock(ListenersLock);
|
||||||
@ -308,7 +267,7 @@ void PassInfo::registerPass() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PassInfo::unregisterPass() {
|
void PassInfo::unregisterPass() {
|
||||||
getPassRegistry()->unregisterPass(*this);
|
PassRegistry::getPassRegistry()->unregisterPass(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pass *PassInfo::createPass() const {
|
Pass *PassInfo::createPass() const {
|
||||||
@ -349,7 +308,7 @@ RegisterAGBase::RegisterAGBase(const char *Name, intptr_t InterfaceID,
|
|||||||
PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
|
PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
|
||||||
IIPI->addInterfaceImplemented(InterfaceInfo);
|
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.
|
// passEnumerate callback on each PassInfo object.
|
||||||
//
|
//
|
||||||
void PassRegistrationListener::enumeratePasses() {
|
void PassRegistrationListener::enumeratePasses() {
|
||||||
getPassRegistry()->enumerateWith(this);
|
PassRegistry::getPassRegistry()->enumerateWith(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
PassNameParser::~PassNameParser() {}
|
PassNameParser::~PassNameParser() {}
|
||||||
|
@ -13,7 +13,49 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/PassRegistry.h"
|
#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 {
|
const PassInfo *PassRegistry::getPassInfo(intptr_t TI) const {
|
||||||
sys::SmartScopedLock<true> Guard(Lock);
|
sys::SmartScopedLock<true> Guard(Lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user