[llvm] r210724 - Do not register and de-register PassRegistrationListeners during
Zachary Turner
zturner at google.com
Wed Jun 11 17:16:37 PDT 2014
Author: zturner
Date: Wed Jun 11 19:16:36 2014
New Revision: 210724
URL: http://llvm.org/viewvc/llvm-project?rev=210724&view=rev
Log:
Do not register and de-register PassRegistrationListeners during
construction and destruction.
PassRegistrationListener is intended for use as a generic listener.
In some cases, PassRegistrationListener-derived classes were being
created, and automatically registered and de-registered in static
constructors and destructors. Since ManagedStatics are destroyed
prior to program shutdown, this leads to errors where an attempt is
made to access a ManagedStatic that has already been destroyed.
Reviewed by: rnk, dblaikie
Differential Revision: http://reviews.llvm.org/D4106
Modified:
llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
llvm/trunk/include/llvm/PassSupport.h
llvm/trunk/lib/IR/Pass.cpp
Modified: llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LegacyPassNameParser.h?rev=210724&r1=210723&r2=210724&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/LegacyPassNameParser.h (original)
+++ llvm/trunk/include/llvm/IR/LegacyPassNameParser.h Wed Jun 11 19:16:36 2014
@@ -43,7 +43,7 @@ class PassNameParser : public PassRegist
public cl::parser<const PassInfo*> {
cl::Option *Opt;
public:
- PassNameParser() : Opt(nullptr) {}
+ PassNameParser();
virtual ~PassNameParser();
void initialize(cl::Option &O) {
Modified: llvm/trunk/include/llvm/PassSupport.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=210724&r1=210723&r2=210724&view=diff
==============================================================================
--- llvm/trunk/include/llvm/PassSupport.h (original)
+++ llvm/trunk/include/llvm/PassSupport.h Wed Jun 11 19:16:36 2014
@@ -337,19 +337,12 @@ struct RegisterAnalysisGroup : public Re
/// clients that are interested in which passes get registered and unregistered
/// at runtime (which can be because of the RegisterPass constructors being run
/// as the program starts up, or may be because a shared object just got
-/// loaded). Deriving from the PassRegistrationListener class automatically
-/// registers your object to receive callbacks indicating when passes are loaded
-/// and removed.
+/// loaded).
///
struct PassRegistrationListener {
- /// PassRegistrationListener ctor - Add the current object to the list of
- /// PassRegistrationListeners...
- PassRegistrationListener();
-
- /// dtor - Remove object from list of listeners...
- ///
- virtual ~PassRegistrationListener();
+ PassRegistrationListener() {}
+ virtual ~PassRegistrationListener() {}
/// Callback functions - These functions are invoked whenever a pass is loaded
/// or removed from the current executable.
Modified: llvm/trunk/lib/IR/Pass.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Pass.cpp?rev=210724&r1=210723&r2=210724&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Pass.cpp (original)
+++ llvm/trunk/lib/IR/Pass.cpp Wed Jun 11 19:16:36 2014
@@ -224,17 +224,6 @@ RegisterAGBase::RegisterAGBase(const cha
// PassRegistrationListener implementation
//
-// PassRegistrationListener ctor - Add the current object to the list of
-// PassRegistrationListeners...
-PassRegistrationListener::PassRegistrationListener() {
- PassRegistry::getPassRegistry()->addRegistrationListener(this);
-}
-
-// dtor - Remove object from list of listeners...
-PassRegistrationListener::~PassRegistrationListener() {
- PassRegistry::getPassRegistry()->removeRegistrationListener(this);
-}
-
// enumeratePasses - Iterate over the registered passes, calling the
// passEnumerate callback on each PassInfo object.
//
@@ -242,7 +231,16 @@ void PassRegistrationListener::enumerate
PassRegistry::getPassRegistry()->enumerateWith(this);
}
-PassNameParser::~PassNameParser() {}
+PassNameParser::PassNameParser()
+ : Opt(nullptr) {
+ PassRegistry::getPassRegistry()->addRegistrationListener(this);
+}
+
+PassNameParser::~PassNameParser() {
+ // This only gets called during static destruction, in which case the
+ // PassRegistry will have already been destroyed by llvm_shutdown(). So
+ // attempting to remove the registration listener is an error.
+}
//===----------------------------------------------------------------------===//
// AnalysisUsage Class Implementation
More information about the llvm-commits
mailing list