From ac9590effa90406767a544005ed1de52e258306b Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 10 May 2010 20:40:08 +0000 Subject: [PATCH] Start converting pieces of DeclarationNameTable to be allocated using ASTContext's allocator. While DeclarationNameTable doesn't leak, it uses 'malloc' too often. Start with having 'CXXLiteralOperatorNames' allocated using ASTContext's allocator and add a 'DoDestroy()' method to DeclarationNameTable that is called by ~ASTContext. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103426 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/ASTContext.h | 1 + include/clang/AST/DeclarationName.h | 8 ++++++-- lib/AST/ASTContext.cpp | 7 ++++++- lib/AST/DeclarationName.cpp | 14 ++++++++++---- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index f8a8f179ae..eed1dfd597 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -1294,6 +1294,7 @@ private: // but we include it here so that ASTContext can quickly deallocate them. llvm::PointerIntPair LastSDM; friend class DeclContext; + friend class DeclarationNameTable; void ReleaseDeclContextMaps(); }; diff --git a/include/clang/AST/DeclarationName.h b/include/clang/AST/DeclarationName.h index 94017865d4..6e8316014e 100644 --- a/include/clang/AST/DeclarationName.h +++ b/include/clang/AST/DeclarationName.h @@ -316,15 +316,19 @@ inline bool operator>=(DeclarationName LHS, DeclarationName RHS) { class DeclarationNameTable { void *CXXSpecialNamesImpl; // Actually a FoldingSet * CXXOperatorIdName *CXXOperatorNames; // Operator names - void *CXXLiteralOperatorNames; // Actually a FoldingSet<...> * + void *CXXLiteralOperatorNames; // Actually a CXXOperatorIdName* DeclarationNameTable(const DeclarationNameTable&); // NONCOPYABLE DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE public: - DeclarationNameTable(); + DeclarationNameTable(ASTContext &C); ~DeclarationNameTable(); + /// Free all memory allocated associated with this DeclarationTable that + // is used allocated using the specified ASTContext object. + void DoDestroy(ASTContext &C); + /// getIdentifier - Create a declaration name that is a simple /// identifier. DeclarationName getIdentifier(const IdentifierInfo *ID) { diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 141f1b9bf9..3a8084833e 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -46,7 +46,9 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM, sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0), SourceMgr(SM), LangOpts(LOpts), FreeMemory(FreeMem), Target(t), Idents(idents), Selectors(sels), - BuiltinInfo(builtins), ExternalSource(0), PrintingPolicy(LOpts), + BuiltinInfo(builtins), + DeclarationNames(*this), + ExternalSource(0), PrintingPolicy(LOpts), LastSDM(0, 0) { ObjCIdRedefinitionType = QualType(); ObjCClassRedefinitionType = QualType(); @@ -108,6 +110,9 @@ ASTContext::~ASTContext() { if (GlobalNestedNameSpecifier) GlobalNestedNameSpecifier->Destroy(*this); + // Deallocate the memory associated with the DeclarationNameTable. + DeclarationNames.DoDestroy(*this); + TUDecl->Destroy(*this); } diff --git a/lib/AST/DeclarationName.cpp b/lib/AST/DeclarationName.cpp index 4f85fca538..0623283385 100644 --- a/lib/AST/DeclarationName.cpp +++ b/lib/AST/DeclarationName.cpp @@ -11,10 +11,11 @@ // classes. // //===----------------------------------------------------------------------===// +#include "clang/AST/ASTContext.h" +#include "clang/AST/Decl.h" #include "clang/AST/DeclarationName.h" #include "clang/AST/Type.h" #include "clang/AST/TypeOrdering.h" -#include "clang/AST/Decl.h" #include "clang/Basic/IdentifierTable.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" @@ -383,12 +384,12 @@ void DeclarationName::dump() const { llvm::errs() << '\n'; } -DeclarationNameTable::DeclarationNameTable() { +DeclarationNameTable::DeclarationNameTable(ASTContext &C) { CXXSpecialNamesImpl = new llvm::FoldingSet; CXXLiteralOperatorNames = new llvm::FoldingSet; // Initialize the overloaded operator names. - CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; + CXXOperatorNames = new (C) CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { CXXOperatorNames[Op].ExtraKindOrNumArgs = Op + DeclarationNameExtra::CXXConversionFunction; @@ -421,7 +422,12 @@ DeclarationNameTable::~DeclarationNameTable() { delete SpecialNames; delete LiteralNames; - delete [] CXXOperatorNames; +} + +void DeclarationNameTable::DoDestroy(ASTContext &C) { + if (C.FreeMemory) { + C.Deallocate(CXXOperatorNames); + } } DeclarationName -- 2.40.0