From fe59b7472c06b36efb74fbb50bbdf464fa30c0d8 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 15 Feb 2011 02:47:45 +0000 Subject: [PATCH] Fix memory leak in CFGBuilder resulting from tracking scope information using SmallVectors. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125550 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CFG.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index bc3699ba68..d46b7e7830 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -90,7 +90,7 @@ private: /// class LocalScope { public: - typedef llvm::SmallVector AutomaticVarsTy; + typedef BumpVector AutomaticVarsTy; /// const_iterator - Iterates local scope backwards and jumps to previous /// scope on reaching the beginning of currently iterated scope. @@ -160,6 +160,8 @@ public: friend class const_iterator; private: + BumpVectorContext ctx; + /// Automatic variables in order of declaration. AutomaticVarsTy Vars; /// Iterator to variable in previous scope that was declared just before @@ -168,15 +170,14 @@ private: public: /// Constructs empty scope linked to previous scope in specified place. - LocalScope(const_iterator P) - : Vars() - , Prev(P) {} + LocalScope(BumpVectorContext &ctx, const_iterator P) + : ctx(ctx), Vars(ctx, 4), Prev(P) {} /// Begin of scope in direction of CFG building (backwards). const_iterator begin() const { return const_iterator(*this, Vars.size()); } void addVar(VarDecl* VD) { - Vars.push_back(VD); + Vars.push_back(VD, ctx); } }; @@ -630,8 +631,10 @@ void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) { /// way return valid LocalScope object. LocalScope* CFGBuilder::createOrReuseLocalScope(LocalScope* Scope) { if (!Scope) { - Scope = cfg->getAllocator().Allocate(); - new (Scope) LocalScope(ScopePos); + llvm::BumpPtrAllocator &alloc = cfg->getAllocator(); + Scope = alloc.Allocate(); + BumpVectorContext ctx(alloc); + new (Scope) LocalScope(ctx, ScopePos); } return Scope; } -- 2.50.1