]> granicus.if.org Git - clang/commitdiff
No need to use the PrimaryBaseInfo struct in the builder.
authorAnders Carlsson <andersca@mac.com>
Wed, 26 May 2010 05:20:58 +0000 (05:20 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 26 May 2010 05:20:58 +0000 (05:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104681 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 817f0384357970fd6bc7c1dfce6996df277e9ea2..d071f86c1120d41e76d8a6f036990164ba518c4f 100644 (file)
@@ -145,7 +145,8 @@ private:
                   const uint64_t *fieldoffsets, unsigned fieldcount,
                   uint64_t nonvirtualsize, unsigned nonvirtualalign,
                   uint64_t SizeOfLargestEmptySubobject,
-                  const PrimaryBaseInfo &PrimaryBase,
+                  const CXXRecordDecl *PrimaryBase,
+                  bool PrimaryBaseIsVirtual,
                   const BaseOffsetsMapTy& BaseOffsets,
                   const BaseOffsetsMapTy& VBaseOffsets);
 
index 2cf7e4a1cb390da13d9cc173b794ebd60454099c..262c4597f8468831973e328311dbd5225cd1607e 100644 (file)
@@ -45,7 +45,8 @@ ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
                                  uint64_t nonvirtualsize,
                                  unsigned nonvirtualalign,
                                  uint64_t SizeOfLargestEmptySubobject,
-                                 const PrimaryBaseInfo &PrimaryBase,
+                                 const CXXRecordDecl *PrimaryBase,
+                                 bool PrimaryBaseIsVirtual,
                                  const BaseOffsetsMapTy& BaseOffsets,
                                  const BaseOffsetsMapTy& VBaseOffsets)
   : Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
@@ -56,7 +57,7 @@ ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
     memcpy(FieldOffsets, fieldoffsets, FieldCount * sizeof(*FieldOffsets));
   }
 
-  CXXInfo->PrimaryBase = PrimaryBase;
+  CXXInfo->PrimaryBase = PrimaryBaseInfo(PrimaryBase, PrimaryBaseIsVirtual);
   CXXInfo->NonVirtualSize = nonvirtualsize;
   CXXInfo->NonVirtualAlign = nonvirtualalign;
   CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
index cc4cbb28e630e5bbe263e0b975eee4e365b59633..6c7901259e90647693f8e063a9b306835435bf31 100644 (file)
@@ -24,7 +24,8 @@ using namespace clang;
 ASTRecordLayoutBuilder::ASTRecordLayoutBuilder(ASTContext &Context)
   : Context(Context), Size(0), Alignment(8), Packed(false), 
   UnfilledBitsInLastByte(0), MaxFieldAlignment(0), DataSize(0), IsUnion(false),
-  NonVirtualSize(0), NonVirtualAlignment(8), FirstNearlyEmptyVBase(0),
+  PrimaryBase(0), PrimaryBaseIsVirtual(false), NonVirtualSize(0), 
+  NonVirtualAlignment(8), FirstNearlyEmptyVBase(0),
   SizeOfLargestEmptySubobject(0) { }
 
 /// IsNearlyEmpty - Indicates when a class has a vtable pointer, but
@@ -128,8 +129,8 @@ ASTRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
       // If it's not an indirect primary base, then we've found our primary
       // base.
       if (!IndirectPrimaryBases.count(Base)) {
-        PrimaryBase = ASTRecordLayout::PrimaryBaseInfo(Base,
-                                                       /*IsVirtual=*/true);
+        PrimaryBase = Base;
+        PrimaryBaseIsVirtual = true;
         return;
       }
 
@@ -139,7 +140,7 @@ ASTRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
     }
 
     SelectPrimaryVBase(Base);
-    if (PrimaryBase.getBase())
+    if (PrimaryBase)
       return;
   }
 }
@@ -175,7 +176,8 @@ void ASTRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
 
     if (Base->isDynamicClass()) {
       // We found it.
-      PrimaryBase = ASTRecordLayout::PrimaryBaseInfo(Base, /*IsVirtual=*/false);
+      PrimaryBase = Base;
+      PrimaryBaseIsVirtual = false;
       return;
     }
   }
@@ -184,20 +186,20 @@ void ASTRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
   // indirect primary virtual base class, if one exists.
   if (RD->getNumVBases() != 0) {
     SelectPrimaryVBase(RD);
-    if (PrimaryBase.getBase())
+    if (PrimaryBase)
       return;
   }
 
   // Otherwise, it is the first nearly empty virtual base that is not an
   // indirect primary virtual base class, if one exists.
   if (FirstNearlyEmptyVBase) {
-    PrimaryBase = ASTRecordLayout::PrimaryBaseInfo(FirstNearlyEmptyVBase,
-                                                   /*IsVirtual=*/true);
+    PrimaryBase = FirstNearlyEmptyVBase;
+    PrimaryBaseIsVirtual = true;
     return;
   }
 
   // Otherwise there is no primary base class.
-  assert(!PrimaryBase.getBase() && "Should not get here with a primary base!");
+  assert(!PrimaryBase && "Should not get here with a primary base!");
 
   // Allocate the virtual table pointer at offset zero.
   assert(DataSize == 0 && "Vtable pointer must be at offset zero!");
@@ -216,17 +218,18 @@ ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
   DeterminePrimaryBase(RD);
 
   // If we have a primary base class, lay it out.
-  if (const CXXRecordDecl *Base = PrimaryBase.getBase()) {
-    if (PrimaryBase.isVirtual()) {
+  if (PrimaryBase) {
+    if (PrimaryBaseIsVirtual) {
       // We have a virtual primary base, insert it as an indirect primary base.
-      IndirectPrimaryBases.insert(Base);
+      IndirectPrimaryBases.insert(PrimaryBase);
 
-      assert(!VisitedVirtualBases.count(Base) && "vbase already visited!");
-      VisitedVirtualBases.insert(Base);
+      assert(!VisitedVirtualBases.count(PrimaryBase) && 
+             "vbase already visited!");
+      VisitedVirtualBases.insert(PrimaryBase);
       
-      LayoutVirtualBase(Base);
+      LayoutVirtualBase(PrimaryBase);
     } else
-      LayoutNonVirtualBase(Base);
+      LayoutNonVirtualBase(PrimaryBase);
   }
 
   // Now lay out the non-virtual bases.
@@ -241,7 +244,7 @@ ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
       cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
 
     // Skip the primary base.
-    if (Base == PrimaryBase.getBase() && !PrimaryBase.isVirtual())
+    if (Base == PrimaryBase && PrimaryBaseIsVirtual)
       continue;
 
     // Lay out the base.
@@ -322,8 +325,8 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
   bool PrimaryBaseIsVirtual;
 
   if (MostDerivedClass == RD) {
-    PrimaryBase = this->PrimaryBase.getBase();
-    PrimaryBaseIsVirtual = this->PrimaryBase.isVirtual();
+    PrimaryBase = this->PrimaryBase;
+    PrimaryBaseIsVirtual = this->PrimaryBaseIsVirtual;
   } else {
     const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
     PrimaryBase = Layout.getPrimaryBase();
index 5cb228dfc35bb69669ca595fab7193876943acac..1e5ddb4479c372b5b7a706cdba02f85f82bd31ed 100644 (file)
@@ -61,13 +61,19 @@ class ASTRecordLayoutBuilder {
   
   /// PrimaryBase - the primary base class (if one exists) of the class
   /// we're laying out.
-  ASTRecordLayout::PrimaryBaseInfo PrimaryBase;
+  const CXXRecordDecl *PrimaryBase;
+  
+  /// PrimaryBaseIsVirtual - Whether the primary base of the class we're laying
+  /// out is virtual.
+  bool PrimaryBaseIsVirtual;
 
+  typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t> BaseOffsetsMapTy;
+  
   /// Bases - base classes and their offsets in the record.
-  ASTRecordLayout::BaseOffsetsMapTy Bases;
+  BaseOffsetsMapTy Bases;
   
   // VBases - virtual base classes and their offsets in the record.
-  ASTRecordLayout::BaseOffsetsMapTy VBases;
+  BaseOffsetsMapTy VBases;
 
   /// IndirectPrimaryBases - Virtual base classes, direct or indirect, that are
   /// primary base classes for some other direct or indirect base class.