]> granicus.if.org Git - clang/commitdiff
Record layout builder cleanup.
authorAnders Carlsson <andersca@mac.com>
Tue, 22 Sep 2009 00:04:45 +0000 (00:04 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 22 Sep 2009 00:04:45 +0000 (00:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82502 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/RecordLayout.h
lib/AST/RecordLayoutBuilder.cpp
lib/AST/RecordLayoutBuilder.h

index 66792d715d76cfbb33b1f650f5185b50a794790a..7490b1d66b3ea029085faed2ac58fa4ed999fcca 100644 (file)
@@ -91,9 +91,10 @@ class ASTRecordLayout {
                   const uint64_t *fieldoffsets, unsigned fieldcount,
                   uint64_t nonvirtualsize, unsigned nonvirtualalign,
                   const CXXRecordDecl *PB, bool PBVirtual,
-                  const CXXRecordDecl **bases, const uint64_t *baseoffsets,
-                  unsigned basecount, const CXXRecordDecl **vbases,
-                  const uint64_t *vbaseoffsets,unsigned vbasecount)
+                  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)  {
@@ -106,10 +107,10 @@ class ASTRecordLayout {
     CXXInfo->PrimaryBaseWasVirtual = PBVirtual;
     CXXInfo->NonVirtualSize = nonvirtualsize;
     CXXInfo->NonVirtualAlign = nonvirtualalign;
-    for (unsigned i = 0; i != basecount; ++i)
-      CXXInfo->BaseOffsets[bases[i]] = baseoffsets[i];
-    for (unsigned i = 0; i != vbasecount; ++i)
-      CXXInfo->VBaseOffsets[vbases[i]] = vbaseoffsets[i];
+    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() {
index 598bd261d74747df3effad2e8818660db8dcc2ff..e60b307d3bb47a9f86a1032dbea1e11b7a237428 100644 (file)
@@ -198,8 +198,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
         // Mark it so we don't lay it out twice.
         mark.insert(Base);
         assert (IndirectPrimary.count(Base) && "IndirectPrimary was wrong");
-        VBases.push_back(Base);
-        VBaseOffsets.push_back(Offset);
+        VBases.push_back(std::make_pair(Base, Offset));
       } else if (IndirectPrimary.count(Base)) {
         // Someone else will eventually lay this out.
         ;
@@ -210,7 +209,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
         // Mark it so we don't lay it out twice.
         mark.insert(Base);
         LayoutVirtualBase(Base);
-        BaseOffset = *(VBaseOffsets.end()-1);
+        BaseOffset = VBases.back().second;
       }
     }
     if (Base->getNumVBases()) {
@@ -236,13 +235,10 @@ void ASTRecordLayoutBuilder::LayoutBaseNonVirtually(const CXXRecordDecl *RD,
   Size = (Size + (BaseAlign-1)) & ~(BaseAlign-1);
 
   // Add base class offsets.
-  if (IsVirtualBase) {
-    VBases.push_back(RD);
-    VBaseOffsets.push_back(Size);
-  } else {
-    Bases.push_back(RD);
-    BaseOffsets.push_back(Size);
-  }
+  if (IsVirtualBase) 
+    VBases.push_back(std::make_pair(RD, Size));
+  else
+    Bases.push_back(std::make_pair(RD, Size));
 
 #if 0
   // And now add offsets for all our primary virtual bases as well, so
@@ -469,11 +465,6 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx,
   // FIXME: IsPODForThePurposeOfLayout should be stored in the record layout.
   bool IsPODForThePurposeOfLayout = cast<CXXRecordDecl>(D)->isPOD();
 
-  assert(Builder.Bases.size() == Builder.BaseOffsets.size() &&
-         "Base offsets vector must be same size as bases vector!");
-  assert(Builder.VBases.size() == Builder.VBaseOffsets.size() &&
-         "Base offsets vector must be same size as bases vector!");
-
   // FIXME: This should be done in FinalizeLayout.
   uint64_t DataSize =
     IsPODForThePurposeOfLayout ? Builder.Size : Builder.NextOffset;
@@ -488,10 +479,8 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx,
                              Builder.PrimaryBase,
                              Builder.PrimaryBaseWasVirtual,
                              Builder.Bases.data(),
-                             Builder.BaseOffsets.data(),
                              Builder.Bases.size(),
                              Builder.VBases.data(),
-                             Builder.VBaseOffsets.data(),
                              Builder.VBases.size());
 }
 
index efaa2eeb9818237687ac817f07b9dd75adba450e..39adc29022de567de358c1c44504ab4b3bd3d0ca 100644 (file)
@@ -40,11 +40,11 @@ class ASTRecordLayoutBuilder {
   const CXXRecordDecl *PrimaryBase;
   bool PrimaryBaseWasVirtual;
 
-  llvm::SmallVector<const CXXRecordDecl *, 4> Bases;
-  llvm::SmallVector<uint64_t, 4> BaseOffsets;
-
-  llvm::SmallVector<const CXXRecordDecl *, 4> VBases;
-  llvm::SmallVector<uint64_t, 4> VBaseOffsets;
+  typedef llvm::SmallVector<std::pair<const CXXRecordDecl *, 
+                                      uint64_t>, 4> BaseOffsetsTy;
+  
+  BaseOffsetsTy Bases;
+  BaseOffsetsTy VBases;
 
   ASTRecordLayoutBuilder(ASTContext &Ctx);