diff options
author | Owen Anderson <resistor@mac.com> | 2010-04-06 04:20:48 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-04-06 04:20:48 +0000 |
commit | ffb731245827584c7956106cb6b966b4285dd1e6 (patch) | |
tree | 2d2b1df0f634fdb9e4f42743319709dc0487be17 /lib/VMCore | |
parent | adc6e06ff0c5950abda86574c2da1fc6b863b75c (diff) | |
download | external_llvm-ffb731245827584c7956106cb6b966b4285dd1e6.zip external_llvm-ffb731245827584c7956106cb6b966b4285dd1e6.tar.gz external_llvm-ffb731245827584c7956106cb6b966b4285dd1e6.tar.bz2 |
Use a ManagedCleanup to prevent leaking the PassRegistrar map. In breaks the
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
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Pass.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 6093750..6b941f3 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -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 { |