diff options
author | Owen Anderson <resistor@mac.com> | 2010-10-20 22:22:30 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-10-20 22:22:30 +0000 |
commit | 75f6df283f726c289b240fe8c5f2f42cdfff5d5f (patch) | |
tree | db80bdfeaf16f8f7510d3d24f9603e33f1bb0e7f /lib | |
parent | ba13864483b696e7f8e2058c3a50b5d901f2213b (diff) | |
download | external_llvm-75f6df283f726c289b240fe8c5f2f42cdfff5d5f.tar.gz external_llvm-75f6df283f726c289b240fe8c5f2f42cdfff5d5f.tar.bz2 external_llvm-75f6df283f726c289b240fe8c5f2f42cdfff5d5f.zip |
Attempt to fix valgrind complaining about (benign) leaks in pass registration by having PassRegistry
delete PassInfo objects that were created using new-style initialization.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116959 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/PassRegistry.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/VMCore/PassRegistry.cpp b/lib/VMCore/PassRegistry.cpp index 85fea2feea..95ca681409 100644 --- a/lib/VMCore/PassRegistry.cpp +++ b/lib/VMCore/PassRegistry.cpp @@ -54,6 +54,7 @@ struct PassRegistryImpl { }; DenseMap<const PassInfo*, AnalysisGroupInfo> AnalysisGroupInfoMap; + std::vector<const PassInfo*> ToFree; std::vector<PassRegistrationListener*> Listeners; }; @@ -70,6 +71,11 @@ void *PassRegistry::getImpl() const { PassRegistry::~PassRegistry() { sys::SmartScopedLock<true> Guard(*Lock); PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(pImpl); + + for (std::vector<const PassInfo*>::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<true> Guard(*Lock); PassRegistryImpl *Impl = static_cast<PassRegistryImpl*>(getImpl()); bool Inserted = @@ -105,6 +111,8 @@ void PassRegistry::registerPass(const PassInfo &PI) { for (std::vector<PassRegistrationListener*>::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<PassInfo*>(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<PassRegistryImpl*>(getImpl()); + if (ShouldFree) Impl->ToFree.push_back(&Registeree); } void PassRegistry::addRegistrationListener(PassRegistrationListener *L) { |