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 | 80b8817c9d3606a8b3e73704c3f1aabfd0195e53 (patch) | |
| tree | d9e28d72fc31f791d39fec9d0f0147b2c9b58d4c /llvm/lib | |
| parent | a2ab75bc8d96a00c64bc268f614889cf4e871f51 (diff) | |
| download | bcm5719-llvm-80b8817c9d3606a8b3e73704c3f1aabfd0195e53.tar.gz bcm5719-llvm-80b8817c9d3606a8b3e73704c3f1aabfd0195e53.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.
llvm-svn: 116959
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/VMCore/PassRegistry.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/VMCore/PassRegistry.cpp b/llvm/lib/VMCore/PassRegistry.cpp index 85fea2feeaf..95ca6814094 100644 --- a/llvm/lib/VMCore/PassRegistry.cpp +++ b/llvm/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) { |

