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
This commit is contained in:
Ted Kremenek 2010-05-10 20:40:08 +00:00
Родитель d04ed416be
Коммит ac9590effa
4 изменённых файлов: 23 добавлений и 7 удалений

Просмотреть файл

@ -1294,6 +1294,7 @@ private:
// but we include it here so that ASTContext can quickly deallocate them.
llvm::PointerIntPair<StoredDeclsMap*,1> LastSDM;
friend class DeclContext;
friend class DeclarationNameTable;
void ReleaseDeclContextMaps();
};

Просмотреть файл

@ -316,15 +316,19 @@ inline bool operator>=(DeclarationName LHS, DeclarationName RHS) {
class DeclarationNameTable {
void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> *
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) {

Просмотреть файл

@ -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);
}

Просмотреть файл

@ -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<CXXSpecialName>;
CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>;
// 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