]> granicus.if.org Git - clang/commitdiff
Get rid of the PrimaryBase parameter from LayoutVirtualBases.
authorAnders Carlsson <andersca@mac.com>
Thu, 11 Mar 2010 04:33:54 +0000 (04:33 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 11 Mar 2010 04:33:54 +0000 (04:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98233 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
lib/AST/RecordLayoutBuilder.h

index ca850cb348f0ed0f4349c4a8bd27662d30bad20e..842967780b7fb9f9606d53f10c85af4200ccbe4c 100644 (file)
@@ -217,11 +217,18 @@ void ASTRecordLayoutBuilder::LayoutNonVirtualBase(const CXXRecordDecl *RD) {
 }
 
 void 
-ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
-                                           const CXXRecordDecl *RD,
-                                           const CXXRecordDecl *PB,
-                                           uint64_t Offset) {
-  
+ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
+                                        uint64_t Offset,
+                                        const CXXRecordDecl *MostDerivedClass) {
+  const CXXRecordDecl *PrimaryBase;
+  
+  if (MostDerivedClass == RD)
+    PrimaryBase = this->PrimaryBase.getBase();
+  else {
+    const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
+    PrimaryBase = Layout.getPrimaryBase();
+  }
+
   for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
          E = RD->bases_end(); I != E; ++I) {
     assert(!I->getType()->isDependentType() &&
@@ -231,7 +238,7 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
       cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
 
     if (I->isVirtual()) {
-      if (Base == PB) {
+      if (Base == PrimaryBase) {
         // Only lay things out once.
         if (VisitedVirtualBases.count(Base))
           continue;
@@ -268,7 +275,7 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
       // We want the vbase offset from the class we're currently laying out.
       assert(VBases.count(Base) && "Did not find virtual base!");
       BaseOffset = VBases[Base];
-    } else if (RD == Class) {
+    } else if (RD == MostDerivedClass) {
       // We want the base offset from the class we're currently laying out.
       assert(Bases.count(Base) && "Did not find base!");
       BaseOffset = Bases[Base];
@@ -277,9 +284,7 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class,
       BaseOffset = Offset + Layout.getBaseClassOffset(Base);
     }
     
-    const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Base);
-    const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().getBase();
-    LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset);
+    LayoutVirtualBases(Base, BaseOffset, MostDerivedClass);
   }
 }
 
@@ -501,9 +506,9 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) {
   NonVirtualSize = Size;
   NonVirtualAlignment = Alignment;
 
-  if (RD) {
-    LayoutVirtualBases(RD, RD, PrimaryBase.getBase(), 0);
-  }
+  // If this is a C++ clas, lay out its virtual bases.
+  if (RD)
+    LayoutVirtualBases(RD, 0, RD);
 
   // Finally, round the size of the total struct up to the alignment of the
   // struct itself.
index 933e35025fd0b8b118b134bd3871c34734ec55d3..79f1ef652f90b0d7d1e7223421d5801d7dbdb37d 100644 (file)
@@ -113,8 +113,8 @@ class ASTRecordLayoutBuilder {
   void LayoutNonVirtualBase(const CXXRecordDecl *RD);
 
   /// LayoutVirtualBases - Lays out all the virtual bases.
-  void LayoutVirtualBases(const CXXRecordDecl *Class, const CXXRecordDecl *RD,
-                          const CXXRecordDecl *PB, uint64_t Offset); 
+  void LayoutVirtualBases(const CXXRecordDecl *RD, uint64_t Offset,
+                          const CXXRecordDecl *MostDerivedClass);
 
   /// LayoutVirtualBase - Lays out a single virtual base.
   void LayoutVirtualBase(const CXXRecordDecl *RD);