]> granicus.if.org Git - clang/commitdiff
Move Storage and StorageAllocator out of the PartialDiagnostic class so we can forwar...
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 4 Feb 2012 12:30:46 +0000 (12:30 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 4 Feb 2012 12:30:46 +0000 (12:30 +0000)
Let ASTContext allocate the storage in its BumpPtrAllocator.
This will help us remove ASTContext's depedency on PartialDiagnostic.h soon.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149780 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
include/clang/Basic/Diagnostic.h
include/clang/Basic/PartialDiagnostic.h
lib/AST/ASTContext.cpp
lib/Basic/Diagnostic.cpp

index 6a7b7d90e57aeaa28f3a0e2c9e3a1e8b40c440aa..870c8bb04052fbb21c9f535a5d367d8f557695a8 100644 (file)
@@ -49,6 +49,7 @@ namespace clang {
   class ExternalASTSource;
   class ASTMutationListener;
   class IdentifierTable;
+  class PartialDiagnosticStorageAllocator;
   class SelectorTable;
   class SourceManager;
   class TargetInfo;
@@ -346,7 +347,7 @@ class ASTContext : public llvm::RefCountedBase<ASTContext> {
   mutable llvm::BumpPtrAllocator BumpAlloc;
 
   /// \brief Allocator for partial diagnostics.
-  PartialDiagnostic::StorageAllocator DiagAllocator;
+  PartialDiagnosticStorageAllocator *DiagAllocator;
 
   /// \brief The current C++ ABI.
   llvm::OwningPtr<CXXABI> ABI;
@@ -391,8 +392,8 @@ public:
   /// Return the total memory used for various side tables.
   size_t getSideTableAllocatedMemory() const;
   
-  PartialDiagnostic::StorageAllocator &getDiagAllocator() {
-    return DiagAllocator;
+  PartialDiagnosticStorageAllocator &getDiagAllocator() {
+    return *DiagAllocator;
   }
 
   const TargetInfo &getTargetInfo() const { return *Target; }
index 8cb1e19940bf292b7ff5ad98615fe2c44b6becfd..e5dff5ad099ea1a0e05e787f425bbdbdf405e715 100644 (file)
@@ -593,6 +593,7 @@ private:
   friend class DiagnosticBuilder;
   friend class Diagnostic;
   friend class PartialDiagnostic;
+  friend struct PartialDiagnosticStorage;
   friend class DiagnosticErrorTrap;
   
   /// CurDiagLoc - This is the location of the current diagnostic that is in
index f6092e685819d323b15a4ca4d1e7eef14e983606..7bc9f546557bd22b071050054d343b27d1162caa 100644 (file)
 
 namespace clang {
 
-class PartialDiagnostic {
-public:
+struct PartialDiagnosticStorage {
+  PartialDiagnosticStorage() : NumDiagArgs(0), NumDiagRanges(0) { }
+
   enum {
-      // The MaxArguments and MaxFixItHints member enum values from
-      // DiagnosticsEngine are private but DiagnosticsEngine declares
-      // PartialDiagnostic a friend.  These enum values are redeclared
-      // here so that the nested Storage class below can access them.
+      /// MaxArguments - The maximum number of arguments we can hold. We
+      /// currently only support up to 10 arguments (%0-%9).
+      /// A single diagnostic with more than that almost certainly has to
+      /// be simplified anyway.
       MaxArguments = DiagnosticsEngine::MaxArguments
   };
 
-  struct Storage {
-    Storage() : NumDiagArgs(0), NumDiagRanges(0) { }
-
-    enum {
-        /// MaxArguments - The maximum number of arguments we can hold. We
-        /// currently only support up to 10 arguments (%0-%9).
-        /// A single diagnostic with more than that almost certainly has to
-        /// be simplified anyway.
-        MaxArguments = PartialDiagnostic::MaxArguments
-    };
-
-    /// NumDiagArgs - This contains the number of entries in Arguments.
-    unsigned char NumDiagArgs;
-
-    /// NumDiagRanges - This is the number of ranges in the DiagRanges array.
-    unsigned char NumDiagRanges;
-
-    /// DiagArgumentsKind - This is an array of ArgumentKind::ArgumentKind enum
-    /// values, with one for each argument.  This specifies whether the argument
-    /// is in DiagArgumentsStr or in DiagArguments.
-    unsigned char DiagArgumentsKind[MaxArguments];
-
-    /// DiagArgumentsVal - The values for the various substitution positions.
-    /// This is used when the argument is not an std::string. The specific value
-    /// is mangled into an intptr_t and the interpretation depends on exactly
-    /// what sort of argument kind it is.
-    intptr_t DiagArgumentsVal[MaxArguments];
-
-    /// \brief The values for the various substitution positions that have
-    /// string arguments.
-    std::string DiagArgumentsStr[MaxArguments];
-
-    /// DiagRanges - The list of ranges added to this diagnostic.  It currently
-    /// only support 10 ranges, could easily be extended if needed.
-    CharSourceRange DiagRanges[10];
-
-    /// FixItHints - If valid, provides a hint with some code
-    /// to insert, remove, or modify at a particular position.
-    SmallVector<FixItHint, 6>  FixItHints;
-  };
+  /// NumDiagArgs - This contains the number of entries in Arguments.
+  unsigned char NumDiagArgs;
 
-  /// \brief An allocator for Storage objects, which uses a small cache to
-  /// objects, used to reduce malloc()/free() traffic for partial diagnostics.
-  class StorageAllocator {
-    static const unsigned NumCached = 16;
-    Storage Cached[NumCached];
-    Storage *FreeList[NumCached];
-    unsigned NumFreeListEntries;
-
-  public:
-    StorageAllocator();
-    ~StorageAllocator();
-
-    /// \brief Allocate new storage.
-    Storage *Allocate() {
-      if (NumFreeListEntries == 0)
-        return new Storage;
-
-      Storage *Result = FreeList[--NumFreeListEntries];
-      Result->NumDiagArgs = 0;
-      Result->NumDiagRanges = 0;
-      Result->FixItHints.clear();
-      return Result;
-    }
+  /// NumDiagRanges - This is the number of ranges in the DiagRanges array.
+  unsigned char NumDiagRanges;
+
+  /// DiagArgumentsKind - This is an array of ArgumentKind::ArgumentKind enum
+  /// values, with one for each argument.  This specifies whether the argument
+  /// is in DiagArgumentsStr or in DiagArguments.
+  unsigned char DiagArgumentsKind[MaxArguments];
+
+  /// DiagArgumentsVal - The values for the various substitution positions.
+  /// This is used when the argument is not an std::string. The specific value
+  /// is mangled into an intptr_t and the interpretation depends on exactly
+  /// what sort of argument kind it is.
+  intptr_t DiagArgumentsVal[MaxArguments];
+
+  /// \brief The values for the various substitution positions that have
+  /// string arguments.
+  std::string DiagArgumentsStr[MaxArguments];
+
+  /// DiagRanges - The list of ranges added to this diagnostic.  It currently
+  /// only support 10 ranges, could easily be extended if needed.
+  CharSourceRange DiagRanges[10];
+
+  /// FixItHints - If valid, provides a hint with some code
+  /// to insert, remove, or modify at a particular position.
+  SmallVector<FixItHint, 6>  FixItHints;
+};
 
-    /// \brief Free the given storage object.
-    void Deallocate(Storage *S) {
-      if (S >= Cached && S <= Cached + NumCached) {
-        FreeList[NumFreeListEntries++] = S;
-        return;
-      }
+/// \brief An allocator for Storage objects, which uses a small cache to
+/// objects, used to reduce malloc()/free() traffic for partial diagnostics.
+class PartialDiagnosticStorageAllocator {
+  static const unsigned NumCached = 16;
+  typedef PartialDiagnosticStorage Storage;
+  Storage Cached[NumCached];
+  Storage *FreeList[NumCached];
+  unsigned NumFreeListEntries;
 
-      delete S;
+public:
+  PartialDiagnosticStorageAllocator();
+  ~PartialDiagnosticStorageAllocator();
+
+  /// \brief Allocate new storage.
+  Storage *Allocate() {
+    if (NumFreeListEntries == 0)
+      return new Storage;
+
+    Storage *Result = FreeList[--NumFreeListEntries];
+    Result->NumDiagArgs = 0;
+    Result->NumDiagRanges = 0;
+    Result->FixItHints.clear();
+    return Result;
+  }
+
+  /// \brief Free the given storage object.
+  void Deallocate(Storage *S) {
+    if (S >= Cached && S <= Cached + NumCached) {
+      FreeList[NumFreeListEntries++] = S;
+      return;
     }
-  };
+
+    delete S;
+  }
+};
+
+class PartialDiagnostic {
+public:
+  typedef PartialDiagnosticStorage Storage;
+  typedef PartialDiagnosticStorageAllocator StorageAllocator;
 
 private:
   // NOTE: Sema assumes that PartialDiagnostic is location-invariant
index c9af67c8b6fec591cf94b935283cd1ac00b10862..8f9ab719b95ff6a178b147f4aa43cf1a1551a2fd 100644 (file)
@@ -241,6 +241,9 @@ ASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM,
     LastSDM(0, 0),
     UniqueBlockByRefTypeID(0) 
 {
+  // Create a new allocator for partial diagnostics.
+  DiagAllocator = new (BumpAlloc) PartialDiagnosticStorageAllocator;
+
   if (size_reserve > 0) Types.reserve(size_reserve);
   TUDecl = TranslationUnitDecl::Create(*this);
   
@@ -285,6 +288,9 @@ ASTContext::~ASTContext() {
                                                     AEnd = DeclAttrs.end();
        A != AEnd; ++A)
     A->second->~AttrVec();
+
+  // Destroy the partial diagnostic allocator.
+  DiagAllocator->~PartialDiagnosticStorageAllocator();
 }
 
 void ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) {
index c330215db1aadbd2eabd118b75e3c5b6c6e6e914..fc7aaebc59a9df4a72f463a467cf22ec6bec6119 100644 (file)
@@ -842,13 +842,13 @@ bool DiagnosticConsumer::IncludeInDiagnosticCounts() const { return true; }
 
 void IgnoringDiagConsumer::anchor() { }
 
-PartialDiagnostic::StorageAllocator::StorageAllocator() {
+PartialDiagnosticStorageAllocator::PartialDiagnosticStorageAllocator() {
   for (unsigned I = 0; I != NumCached; ++I)
     FreeList[I] = Cached + I;
   NumFreeListEntries = NumCached;
 }
 
-PartialDiagnostic::StorageAllocator::~StorageAllocator() {
+PartialDiagnosticStorageAllocator::~PartialDiagnosticStorageAllocator() {
   // Don't assert if we are in a CrashRecovery context, as this
   // invariant may be invalidated during a crash.
   assert((NumFreeListEntries == NumCached || llvm::CrashRecoveryContext::isRecoveringFromCrash()) && "A partial is on the lamb");