mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-09 09:32:20 +00:00
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 llvm-svn: 210724
This commit is contained in:
parent
29d0e6b601
commit
39c422da57
@ -43,7 +43,7 @@ class PassNameParser : public PassRegistrationListener,
|
||||
public cl::parser<const PassInfo*> {
|
||||
cl::Option *Opt;
|
||||
public:
|
||||
PassNameParser() : Opt(nullptr) {}
|
||||
PassNameParser();
|
||||
virtual ~PassNameParser();
|
||||
|
||||
void initialize(cl::Option &O) {
|
||||
|
@ -337,19 +337,12 @@ struct RegisterAnalysisGroup : public RegisterAGBase {
|
||||
/// 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.
|
||||
|
@ -224,17 +224,6 @@ RegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID,
|
||||
// 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::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
|
||||
|
Loading…
Reference in New Issue
Block a user