summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-03-29 23:56:53 +0000
committerDouglas Gregor <dgregor@apple.com>2010-03-29 23:56:53 +0000
commita55530e5914aa4b9d4edd713b5a45cf9d9fb69c9 (patch)
tree0e86b2652656de523413864c6a6f7aa5448a93cc
parentc95156262d6f5da3cdfaa8e062c3893d53d5cf44 (diff)
downloadbcm5719-llvm-a55530e5914aa4b9d4edd713b5a45cf9d9fb69c9.tar.gz
bcm5719-llvm-a55530e5914aa4b9d4edd713b5a45cf9d9fb69c9.zip
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. llvm-svn: 99854
-rw-r--r--clang/include/clang/AST/DeclContextInternals.h1
-rw-r--r--clang/include/clang/AST/DependentDiagnostic.h5
-rw-r--r--clang/include/clang/Basic/PartialDiagnostic.h22
-rw-r--r--clang/lib/AST/DeclBase.cpp19
4 files changed, 28 insertions, 19 deletions
diff --git a/clang/include/clang/AST/DeclContextInternals.h b/clang/include/clang/AST/DeclContextInternals.h
index 132ca87a5f9..16cb491344b 100644
--- a/clang/include/clang/AST/DeclContextInternals.h
+++ b/clang/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/clang/include/clang/AST/DependentDiagnostic.h b/clang/include/clang/AST/DependentDiagnostic.h
index fb119a9f455..1954a282e80 100644
--- a/clang/include/clang/AST/DependentDiagnostic.h
+++ b/clang/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/clang/include/clang/Basic/PartialDiagnostic.h b/clang/include/clang/Basic/PartialDiagnostic.h
index 56082b7b09f..d49e621d2f1 100644
--- a/clang/include/clang/Basic/PartialDiagnostic.h
+++ b/clang/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 <cassert>
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<StorageAllocator *>(~uintptr_t(0)));
DiagStorage = new Storage;
+ }
return DiagStorage;
}
@@ -137,7 +141,7 @@ private:
if (Allocator)
Allocator->Deallocate(DiagStorage);
- else
+ else if (Allocator != reinterpret_cast<StorageAllocator *>(~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<StorageAllocator *>(~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<intptr_t>(T.getAsOpaquePtr()),
@@ -285,4 +299,4 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
} // end namespace clang
-#endif
+#endif
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index cb6b76c2487..c693e153dda 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/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<DependentStoredDeclsMap*>(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;
OpenPOWER on IntegriCloud