]> granicus.if.org Git - clang/commitdiff
Allocate ASTRecordLayout objects using the allocator associated with ASTContext.
authorTed Kremenek <kremenek@apple.com>
Mon, 8 Mar 2010 20:56:29 +0000 (20:56 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 8 Mar 2010 20:56:29 +0000 (20:56 +0000)
This allows them to be allocated using a BumpPtrAllocated
in the common case.

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

include/clang/AST/RecordLayout.h
lib/AST/ASTContext.cpp
lib/AST/CMakeLists.txt
lib/AST/RecordLayout.cpp [new file with mode: 0644]
lib/AST/RecordLayoutBuilder.cpp

index e8d1788ded8855a9a8691af02944267aa70e05d5..cd25969db0b0cc84c726eb6666a5daddf774e7a3 100644 (file)
@@ -128,47 +128,24 @@ private:
   friend class ASTContext;
   friend class ASTRecordLayoutBuilder;
 
-  ASTRecordLayout(uint64_t size, unsigned alignment, unsigned datasize,
-                  const uint64_t *fieldoffsets, unsigned fieldcount)
-  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
-    FieldCount(fieldcount), CXXInfo(0) {
-    if (FieldCount > 0)  {
-      FieldOffsets = new uint64_t[FieldCount];
-      for (unsigned i = 0; i < FieldCount; ++i)
-        FieldOffsets[i] = fieldoffsets[i];
-    }
-  }
+  ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
+                  unsigned datasize, const uint64_t *fieldoffsets,
+                  unsigned fieldcount);
 
   // Constructor for C++ records.
-  ASTRecordLayout(uint64_t size, unsigned alignment, uint64_t datasize,
+  ASTRecordLayout(ASTContext &Ctx,
+                  uint64_t size, unsigned alignment, uint64_t datasize,
                   const uint64_t *fieldoffsets, unsigned fieldcount,
                   uint64_t nonvirtualsize, unsigned nonvirtualalign,
                   const PrimaryBaseInfo &PrimaryBase,
                   const std::pair<const CXXRecordDecl *, uint64_t> *bases,
                   unsigned numbases,
                   const std::pair<const CXXRecordDecl *, uint64_t> *vbases,
-                  unsigned numvbases)
-  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
-  FieldCount(fieldcount), CXXInfo(new CXXRecordLayoutInfo) {
-    if (FieldCount > 0)  {
-      FieldOffsets = new uint64_t[FieldCount];
-      for (unsigned i = 0; i < FieldCount; ++i)
-        FieldOffsets[i] = fieldoffsets[i];
-    }
+                  unsigned numvbases);
 
-    CXXInfo->PrimaryBase = PrimaryBase;
-    CXXInfo->NonVirtualSize = nonvirtualsize;
-    CXXInfo->NonVirtualAlign = nonvirtualalign;
-    for (unsigned i = 0; i != numbases; ++i)
-      CXXInfo->BaseOffsets[bases[i].first] = bases[i].second;
-    for (unsigned i = 0; i != numvbases; ++i)
-      CXXInfo->VBaseOffsets[vbases[i].first] = vbases[i].second;
-  }
+  ~ASTRecordLayout() {}
 
-  ~ASTRecordLayout() {
-    delete [] FieldOffsets;
-    delete CXXInfo;
-  }
+  void Destroy(ASTContext &Ctx);
 
   ASTRecordLayout(const ASTRecordLayout&);   // DO NOT IMPLEMENT
   void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
index d8c1c84858249fc4ec4625b67f3190f6a5d52b84..e2c80a6da59d66db859469d80ded3bda37311bdd 100644 (file)
@@ -78,21 +78,21 @@ ASTContext::~ASTContext() {
       // Increment in loop to prevent using deallocated memory.
       Deallocate(&*I++);
     }
-  }
 
-  for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
-       I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
-    // Increment in loop to prevent using deallocated memory.
-    ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second);
-    delete R;
-  }
+    for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
+         I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
+      // Increment in loop to prevent using deallocated memory.
+      if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
+        R->Destroy(*this);
+    }
 
-  for (llvm::DenseMap<const ObjCContainerDecl*,
-                      const ASTRecordLayout*>::iterator
-       I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) {
-    // Increment in loop to prevent using deallocated memory.
-    ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second);
-    delete R;
+    for (llvm::DenseMap<const ObjCContainerDecl*,
+         const ASTRecordLayout*>::iterator
+         I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) {
+      // Increment in loop to prevent using deallocated memory.
+      if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
+        R->Destroy(*this);
+    }
   }
 
   // Destroy nested-name-specifiers.
index e5bd9b7722c519c6e1652a7452c509b7c70643c6..2f1a6af77aa967f69d59c774f4fdfb420138ed1b 100644 (file)
@@ -4,8 +4,8 @@ add_clang_library(clangAST
   APValue.cpp
   ASTConsumer.cpp
   ASTContext.cpp
-  ASTImporter.cpp
   ASTDiagnostic.cpp
+  ASTImporter.cpp
   AttrImpl.cpp
   CXXInheritance.cpp
   Decl.cpp
@@ -23,6 +23,7 @@ add_clang_library(clangAST
   InheritViz.cpp
   NestedNameSpecifier.cpp
   ParentMap.cpp
+  RecordLayout.cpp
   RecordLayoutBuilder.cpp
   Stmt.cpp
   StmtDumper.cpp
diff --git a/lib/AST/RecordLayout.cpp b/lib/AST/RecordLayout.cpp
new file mode 100644 (file)
index 0000000..9f8bdec
--- /dev/null
@@ -0,0 +1,69 @@
+//===-- RecordLayout.cpp - Layout information for a struct/union -*- C++ -*-==//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines the RecordLayout interface.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/RecordLayout.h"
+
+using namespace clang;
+
+void ASTRecordLayout::Destroy(ASTContext &Ctx) {
+  if (FieldOffsets)
+    Ctx.Deallocate(FieldOffsets);
+  if (CXXInfo)
+    Ctx.Deallocate(CXXInfo);
+  this->~ASTRecordLayout();
+  Ctx.Deallocate(this);
+}
+
+ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
+                unsigned datasize, const uint64_t *fieldoffsets,
+                unsigned fieldcount)
+  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
+    FieldCount(fieldcount), CXXInfo(0) {
+  if (FieldCount > 0)  {
+    FieldOffsets = new (Ctx) uint64_t[FieldCount];
+    for (unsigned i = 0; i < FieldCount; ++i)
+      FieldOffsets[i] = fieldoffsets[i];
+  }
+}
+
+// Constructor for C++ records.
+ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
+                       uint64_t size, unsigned alignment,
+                       uint64_t datasize,
+                       const uint64_t *fieldoffsets,
+                       unsigned fieldcount,
+                       uint64_t nonvirtualsize,
+                       unsigned nonvirtualalign,
+                       const PrimaryBaseInfo &PrimaryBase,
+                       const std::pair<const CXXRecordDecl *, uint64_t> *bases,
+                       unsigned numbases,
+                       const std::pair<const CXXRecordDecl *, uint64_t> *vbases,
+                       unsigned numvbases)
+  : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
+    FieldCount(fieldcount), CXXInfo(new (Ctx) CXXRecordLayoutInfo)
+{
+  if (FieldCount > 0)  {
+    FieldOffsets = new (Ctx) uint64_t[FieldCount];
+    for (unsigned i = 0; i < FieldCount; ++i)
+      FieldOffsets[i] = fieldoffsets[i];
+  }
+
+  CXXInfo->PrimaryBase = PrimaryBase;
+  CXXInfo->NonVirtualSize = nonvirtualsize;
+  CXXInfo->NonVirtualAlign = nonvirtualalign;
+  for (unsigned i = 0; i != numbases; ++i)
+    CXXInfo->BaseOffsets[bases[i].first] = bases[i].second;
+  for (unsigned i = 0; i != numvbases; ++i)
+    CXXInfo->VBaseOffsets[vbases[i].first] = vbases[i].second;
+}
index 10c5089f2253f6a49c479af3035bca0fc1d9d23d..22285ca420328c6707ff26d2c9a68814866eec92 100644 (file)
@@ -675,9 +675,10 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx,
   Builder.Layout(D);
 
   if (!isa<CXXRecordDecl>(D))
-    return new ASTRecordLayout(Builder.Size, Builder.Alignment, Builder.Size,
-                               Builder.FieldOffsets.data(),
-                               Builder.FieldOffsets.size());
+    return new (Ctx) ASTRecordLayout(Ctx, Builder.Size, Builder.Alignment,
+                                     Builder.Size,
+                                     Builder.FieldOffsets.data(),
+                                     Builder.FieldOffsets.size());
 
   // FIXME: This is not always correct. See the part about bitfields at
   // http://www.codesourcery.com/public/cxx-abi/abi.html#POD for more info.
@@ -690,16 +691,16 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx,
   uint64_t NonVirtualSize =
     IsPODForThePurposeOfLayout ? DataSize : Builder.NonVirtualSize;
 
-  return new ASTRecordLayout(Builder.Size, Builder.Alignment, DataSize,
-                             Builder.FieldOffsets.data(),
-                             Builder.FieldOffsets.size(),
-                             NonVirtualSize,
-                             Builder.NonVirtualAlignment,
-                             Builder.PrimaryBase,
-                             Builder.Bases.data(),
-                             Builder.Bases.size(),
-                             Builder.VBases.data(),
-                             Builder.VBases.size());
+  return new (Ctx) ASTRecordLayout(Ctx, Builder.Size, Builder.Alignment,
+                                   DataSize, Builder.FieldOffsets.data(),
+                                   Builder.FieldOffsets.size(),
+                                   NonVirtualSize,
+                                   Builder.NonVirtualAlignment,
+                                   Builder.PrimaryBase,
+                                   Builder.Bases.data(),
+                                   Builder.Bases.size(),
+                                   Builder.VBases.data(),
+                                   Builder.VBases.size());
 }
 
 const ASTRecordLayout *
@@ -710,10 +711,10 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx,
 
   Builder.Layout(D, Impl);
 
-  return new ASTRecordLayout(Builder.Size, Builder.Alignment,
-                             Builder.DataSize,
-                             Builder.FieldOffsets.data(),
-                             Builder.FieldOffsets.size());
+  return new (Ctx) ASTRecordLayout(Ctx, Builder.Size, Builder.Alignment,
+                                   Builder.DataSize,
+                                   Builder.FieldOffsets.data(),
+                                   Builder.FieldOffsets.size());
 }
 
 const CXXMethodDecl *