]> granicus.if.org Git - clang/commitdiff
When copying a partial diagnostic into a DependentDiagnostic, allocate
authorDouglas Gregor <dgregor@apple.com>
Mon, 29 Mar 2010 23:56:53 +0000 (23:56 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 29 Mar 2010 23:56:53 +0000 (23:56 +0000)
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
include/clang/AST/DependentDiagnostic.h
include/clang/Basic/PartialDiagnostic.h
lib/AST/DeclBase.cpp

index 132ca87a5f9b3f7038388e3acf3360592a53a2e0..16cb491344bc8fae040791674d2cb824bbd9286c 100644 (file)
@@ -275,7 +275,6 @@ private:
 class DependentStoredDeclsMap : public StoredDeclsMap {
 public:
   DependentStoredDeclsMap() : FirstDiagnostic(0) {}
-  ~DependentStoredDeclsMap();
 
 private:
   friend class DependentDiagnostic;
index fb119a9f455eec9bc12a7950866098c9951fea11..1954a282e8020d49cb561cacd656af3bd95cfa3d 100644 (file)
@@ -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);
index 56082b7b09f4fe76a61e05c2ec23fa5bee9c6f33..d49e621d2f1036226d90852b329a3f15175d56b1 100644 (file)
 #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
index cb6b76c24872f5fc56fa5925fba34c9552024faf..c693e153dda590c417c853a109fa23fd6f4f7f14 100644 (file)
@@ -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;