]> granicus.if.org Git - clang/commitdiff
Start converting pieces of DeclarationNameTable to be allocated using ASTContext...
authorTed Kremenek <kremenek@apple.com>
Mon, 10 May 2010 20:40:08 +0000 (20:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 10 May 2010 20:40:08 +0000 (20:40 +0000)
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
include/clang/AST/DeclarationName.h
lib/AST/ASTContext.cpp
lib/AST/DeclarationName.cpp

index f8a8f179ae58ab63b807c40e4ffcb8aa6f7520ab..eed1dfd5970d7c02ac1f40b806d029df273e3278 100644 (file)
@@ -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();
 };
   
index 94017865d4c6d84a1ed3d55c1d46b7ef43d24261..6e8316014e8f773b79ae2581170e19f916d193b5 100644 (file)
@@ -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) {
index 141f1b9bf93ccb8cdbcb40ed93927225eb892e81..3a8084833e40b0ba5b08632635a2d30673796d6d 100644 (file)
@@ -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);
 }
 
index 4f85fca53868c9a1ef037cbbeda81af6cd5b11f4..06232833852c71b672a9f677a2ace5f28326fbac 100644 (file)
 // 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