From 88f4296e85d49e4ea63cda729cd5f696824c67ce Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Thu, 11 Mar 2010 04:33:54 +0000 Subject: [PATCH] Get rid of the PrimaryBase parameter from LayoutVirtualBases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98233 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/RecordLayoutBuilder.cpp | 31 ++++++++++++++++++------------- lib/AST/RecordLayoutBuilder.h | 4 ++-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index ca850cb348..842967780b 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -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(I->getType()->getAs()->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. diff --git a/lib/AST/RecordLayoutBuilder.h b/lib/AST/RecordLayoutBuilder.h index 933e35025f..79f1ef652f 100644 --- a/lib/AST/RecordLayoutBuilder.h +++ b/lib/AST/RecordLayoutBuilder.h @@ -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); -- 2.40.0