зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
d04ed416be
Коммит
ac9590effa
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче