diff --git a/include/llvm/PassRegistry.h b/include/llvm/PassRegistry.h index 31d48a4e28f..5d89c492218 100644 --- a/include/llvm/PassRegistry.h +++ b/include/llvm/PassRegistry.h @@ -53,7 +53,7 @@ public: /// registerPass - Register a pass (by means of its PassInfo) with the /// registry. Required in order to use the pass with a PassManager. - void registerPass(const PassInfo &PI); + void registerPass(const PassInfo &PI, bool ShouldFree = false); /// registerPass - Unregister a pass (by means of its PassInfo) with the /// registry. @@ -63,7 +63,8 @@ public: // an analysis group) with the registry. Like registerPass, this is required // in order for a PassManager to be able to use this group/pass. void registerAnalysisGroup(const void *InterfaceID, const void *PassID, - PassInfo& Registeree, bool isDefault); + PassInfo& Registeree, bool isDefault, + bool ShouldFree = false); /// enumerateWith - Enumerate the registered passes, calling the provided /// PassRegistrationListener's passEnumerate() callback on each of them. diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index d1b4f268c4b..d00d0c0d6da 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -149,7 +149,7 @@ private: static void* initialize##passName##PassOnce(PassRegistry &Registry) { \ PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \ PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \ - Registry.registerPass(*PI); \ + Registry.registerPass(*PI, true); \ return PI; \ } \ void llvm::initialize##passName##Pass(PassRegistry &Registry) { \ @@ -167,7 +167,7 @@ private: #define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \ PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \ PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \ - Registry.registerPass(*PI); \ + Registry.registerPass(*PI, true); \ return PI; \ } \ void llvm::initialize##passName##Pass(PassRegistry &Registry) { \ @@ -252,7 +252,7 @@ struct RegisterAnalysisGroup : public RegisterAGBase { static void* initialize##agName##AnalysisGroupOnce(PassRegistry &Registry) { \ initialize##defaultPass##Pass(Registry); \ PassInfo *AI = new PassInfo(name, & agName :: ID); \ - Registry.registerAnalysisGroup(& agName ::ID, 0, *AI, false); \ + Registry.registerAnalysisGroup(& agName ::ID, 0, *AI, false, true); \ return AI; \ } \ void llvm::initialize##agName##AnalysisGroup(PassRegistry &Registry) { \ @@ -265,10 +265,11 @@ struct RegisterAnalysisGroup : public RegisterAGBase { if (!def) initialize##agName##AnalysisGroup(Registry); \ PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \ PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \ - Registry.registerPass(*PI); \ + Registry.registerPass(*PI, true); \ \ PassInfo *AI = new PassInfo(name, & agName :: ID); \ - Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, *AI, def); \ + Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, \ + *AI, def, true); \ return AI; \ } \ void llvm::initialize##passName##Pass(PassRegistry &Registry) { \ @@ -283,10 +284,11 @@ struct RegisterAnalysisGroup : public RegisterAGBase { #define INITIALIZE_AG_PASS_END(passName, agName, arg, n, cfg, analysis, def) \ PassInfo *PI = new PassInfo(n, arg, & passName ::ID, \ PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \ - Registry.registerPass(*PI); \ + Registry.registerPass(*PI, true); \ \ PassInfo *AI = new PassInfo(n, & agName :: ID); \ - Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, *AI, def); \ + Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, \ + *AI, def, true); \ return AI; \ } \ void llvm::initialize##passName##Pass(PassRegistry &Registry) { \ diff --git a/lib/VMCore/PassRegistry.cpp b/lib/VMCore/PassRegistry.cpp index 85fea2feeaf..95ca6814094 100644 --- a/lib/VMCore/PassRegistry.cpp +++ b/lib/VMCore/PassRegistry.cpp @@ -54,6 +54,7 @@ struct PassRegistryImpl { }; DenseMap AnalysisGroupInfoMap; + std::vector ToFree; std::vector Listeners; }; @@ -70,6 +71,11 @@ void *PassRegistry::getImpl() const { PassRegistry::~PassRegistry() { sys::SmartScopedLock Guard(*Lock); PassRegistryImpl *Impl = static_cast(pImpl); + + for (std::vector::iterator I = Impl->ToFree.begin(), + E = Impl->ToFree.end(); I != E; ++I) + delete *I; + delete Impl; pImpl = 0; } @@ -93,7 +99,7 @@ const PassInfo *PassRegistry::getPassInfo(StringRef Arg) const { // Pass Registration mechanism // -void PassRegistry::registerPass(const PassInfo &PI) { +void PassRegistry::registerPass(const PassInfo &PI, bool ShouldFree) { sys::SmartScopedLock Guard(*Lock); PassRegistryImpl *Impl = static_cast(getImpl()); bool Inserted = @@ -105,6 +111,8 @@ void PassRegistry::registerPass(const PassInfo &PI) { for (std::vector::iterator I = Impl->Listeners.begin(), E = Impl->Listeners.end(); I != E; ++I) (*I)->passRegistered(&PI); + + if (ShouldFree) Impl->ToFree.push_back(&PI); } void PassRegistry::unregisterPass(const PassInfo &PI) { @@ -132,7 +140,8 @@ void PassRegistry::enumerateWith(PassRegistrationListener *L) { void PassRegistry::registerAnalysisGroup(const void *InterfaceID, const void *PassID, PassInfo& Registeree, - bool isDefault) { + bool isDefault, + bool ShouldFree) { PassInfo *InterfaceInfo = const_cast(getPassInfo(InterfaceID)); if (InterfaceInfo == 0) { // First reference to Interface, register it now. @@ -167,6 +176,9 @@ void PassRegistry::registerAnalysisGroup(const void *InterfaceID, InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor()); } } + + PassRegistryImpl *Impl = static_cast(getImpl()); + if (ShouldFree) Impl->ToFree.push_back(&Registeree); } void PassRegistry::addRegistrationListener(PassRegistrationListener *L) {