From b836518bfc0a2ad5e22a670c82fa070ed83ea909 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 29 Mar 2010 23:56:53 +0000 Subject: [PATCH] When copying a partial diagnostic into a DependentDiagnostic, allocate storage for that partial diagnostic via the ASTContext's BumpPtrAllocator rather than using up slots in the ASTContext's cache. Now that we do this, we don't have to worry about destroying dependent diagnostics when destroying a DependentStoredDeclsMap. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99854 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclContextInternals.h | 1 - include/clang/AST/DependentDiagnostic.h | 5 ++++- include/clang/Basic/PartialDiagnostic.h | 22 ++++++++++++++++++---- lib/AST/DeclBase.cpp | 19 ++++++------------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/include/clang/AST/DeclContextInternals.h b/include/clang/AST/DeclContextInternals.h index 132ca87a5f..16cb491344 100644 --- a/include/clang/AST/DeclContextInternals.h +++ b/include/clang/AST/DeclContextInternals.h @@ -275,7 +275,6 @@ private: class DependentStoredDeclsMap : public StoredDeclsMap { public: DependentStoredDeclsMap() : FirstDiagnostic(0) {} - ~DependentStoredDeclsMap(); private: friend class DependentDiagnostic; diff --git a/include/clang/AST/DependentDiagnostic.h b/include/clang/AST/DependentDiagnostic.h index fb119a9f45..1954a282e8 100644 --- a/include/clang/AST/DependentDiagnostic.h +++ b/include/clang/AST/DependentDiagnostic.h @@ -86,7 +86,10 @@ public: } private: - DependentDiagnostic(const PartialDiagnostic &PDiag) : Diag(PDiag) {} + DependentDiagnostic(const PartialDiagnostic &PDiag, + PartialDiagnostic::Storage *Storage) + : Diag(PDiag, Storage) {} + static DependentDiagnostic *Create(ASTContext &Context, DeclContext *Parent, const PartialDiagnostic &PDiag); diff --git a/include/clang/Basic/PartialDiagnostic.h b/include/clang/Basic/PartialDiagnostic.h index 56082b7b09..d49e621d2f 100644 --- a/include/clang/Basic/PartialDiagnostic.h +++ b/include/clang/Basic/PartialDiagnostic.h @@ -19,12 +19,15 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/System/DataTypes.h" +#include namespace clang { class DeclarationName; class PartialDiagnostic { +public: struct Storage { Storage() : NumDiagArgs(0), NumDiagRanges(0), NumCodeModificationHints(0) { } @@ -69,7 +72,6 @@ class PartialDiagnostic { CodeModificationHint CodeModificationHints[MaxCodeModificationHints]; }; -public: /// \brief An allocator for Storage objects, which uses a small cache to /// objects, used to reduce malloc()/free() traffic for partial diagnostics. class StorageAllocator { @@ -126,8 +128,10 @@ private: if (Allocator) DiagStorage = Allocator->Allocate(); - else + else { + assert(Allocator != reinterpret_cast(~uintptr_t(0))); DiagStorage = new Storage; + } return DiagStorage; } @@ -137,7 +141,7 @@ private: if (Allocator) Allocator->Deallocate(DiagStorage); - else + else if (Allocator != reinterpret_cast(~uintptr_t(0))) delete DiagStorage; DiagStorage = 0; } @@ -189,6 +193,14 @@ public: } } + PartialDiagnostic(const PartialDiagnostic &Other, Storage *DiagStorage) + : DiagID(Other.DiagID), DiagStorage(DiagStorage), + Allocator(reinterpret_cast(~uintptr_t(0))) + { + if (Other.DiagStorage) + *this->DiagStorage = *Other.DiagStorage; + } + PartialDiagnostic &operator=(const PartialDiagnostic &Other) { DiagID = Other.DiagID; if (Other.DiagStorage) { @@ -235,6 +247,8 @@ public: freeStorage(); } + bool hasStorage() const { return DiagStorage != 0; } + friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, QualType T) { PD.AddTaggedVal(reinterpret_cast(T.getAsOpaquePtr()), @@ -285,4 +299,4 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, } // end namespace clang -#endif +#endif diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index cb6b76c248..c693e153dd 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -994,17 +994,6 @@ void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) { } } -DependentStoredDeclsMap::~DependentStoredDeclsMap() { - // Kill off the dependent diagnostics. They don't need to be - // deleted, but they do need to be destructed. - DependentDiagnostic *CurD = FirstDiagnostic; - while (CurD) { - DependentDiagnostic *NextD = CurD->NextDiagnostic; - CurD->~DependentDiagnostic(); - CurD = NextD; - } -} - DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C, DeclContext *Parent, const PartialDiagnostic &PDiag) { @@ -1017,9 +1006,13 @@ DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C, DependentStoredDeclsMap *Map = static_cast(Parent->LookupPtr); - // FIXME: Allocate the copy of the PartialDiagnostic via the ASTContext's + // Allocate the copy of the PartialDiagnostic via the ASTContext's // BumpPtrAllocator, rather than the ASTContext itself. - DependentDiagnostic *DD = new (C) DependentDiagnostic(PDiag); + PartialDiagnostic::Storage *DiagStorage = 0; + if (PDiag.hasStorage()) + DiagStorage = new (C) PartialDiagnostic::Storage; + + DependentDiagnostic *DD = new (C) DependentDiagnostic(PDiag, DiagStorage); // TODO: Maybe we shouldn't reverse the order during insertion. DD->NextDiagnostic = Map->FirstDiagnostic; -- 2.40.0