[PATCH] Don't register and de-register all PassRegistrationListeners automatically

Zachary Turner zturner at google.com
Wed Jun 11 17:24:39 PDT 2014


Closed by commit rL210724 (authored by @zturner).

http://reviews.llvm.org/D4106

Files:
  llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
  llvm/trunk/include/llvm/PassSupport.h
  llvm/trunk/lib/IR/Pass.cpp

Index: llvm/trunk/include/llvm/PassSupport.h
===================================================================
--- llvm/trunk/include/llvm/PassSupport.h
+++ llvm/trunk/include/llvm/PassSupport.h
@@ -337,19 +337,12 @@
 /// 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.
Index: llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
===================================================================
--- llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
+++ llvm/trunk/include/llvm/IR/LegacyPassNameParser.h
@@ -43,7 +43,7 @@
                        public cl::parser<const PassInfo*> {
   cl::Option *Opt;
 public:
-  PassNameParser() : Opt(nullptr) {}
+  PassNameParser();
   virtual ~PassNameParser();
 
   void initialize(cl::Option &O) {
Index: llvm/trunk/lib/IR/Pass.cpp
===================================================================
--- llvm/trunk/lib/IR/Pass.cpp
+++ llvm/trunk/lib/IR/Pass.cpp
@@ -224,25 +224,23 @@
 // 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.
 //
 void PassRegistrationListener::enumeratePasses() {
   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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4106.10340.patch
Type: text/x-patch
Size: 3050 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140612/257762b7/attachment.bin>


More information about the llvm-commits mailing list