From 59d5f83b32753b3c9d5defa4d1374f7c9042eb46 Mon Sep 17 00:00:00 2001 From: Torok Edwin Date: Mon, 6 Apr 2009 20:49:21 +0000 Subject: [PATCH] fix (part of) memory leak on shutdown. See PR2975. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68457 91177308-0d34-0410-b5e6-96231b3b80d8 --- examples/HowToUseJIT/HowToUseJIT.cpp | 4 ++++ lib/VMCore/Type.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/examples/HowToUseJIT/HowToUseJIT.cpp b/examples/HowToUseJIT/HowToUseJIT.cpp index 0482df6248f..b5c6d111914 100644 --- a/examples/HowToUseJIT/HowToUseJIT.cpp +++ b/examples/HowToUseJIT/HowToUseJIT.cpp @@ -42,6 +42,7 @@ #include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/GenericValue.h" +#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -109,5 +110,8 @@ int main() { // Import result of execution: outs() << "Result: " << gv.IntVal << "\n"; + EE->freeMachineCodeForFunction(FooF); + delete EE; + llvm_shutdown(); return 0; } diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp index c14d5119e5d..f0ee04ae247 100644 --- a/lib/VMCore/Type.cpp +++ b/lib/VMCore/Type.cpp @@ -666,6 +666,22 @@ protected: std::multimap TypesByHash; public: + ~TypeMapBase() + { + for (std::multimap::iterator I + = TypesByHash.begin(), E = TypesByHash.end(); I != E;) { + Type *Ty = I->second.get(); + if (!Ty->isAbstract() && (isa(Ty) || isa(Ty) || + isa(Ty))) { + TypesByHash.erase(I++); + // PATypeHolder won't destroy it, so we must + Ty->destroy(); + } + else + ++I; + } + } + void RemoveFromTypesByHash(unsigned Hash, const Type *Ty) { std::multimap::iterator I = TypesByHash.lower_bound(Hash); -- 2.34.1