diff options
author | Anders Carlsson <andersca@mac.com> | 2010-03-11 05:42:17 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-03-11 05:42:17 +0000 |
commit | 37147ea14f39a8522e32e3ba4d043a2a33fff90c (patch) | |
tree | 342aaffad0c0b958051bf68ed55a144587c85d3d | |
parent | 88f4296e85d49e4ea63cda729cd5f696824c67ce (diff) |
More record layout builder cleanup and simplification.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98238 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 59 | ||||
-rw-r--r-- | lib/AST/RecordLayoutBuilder.h | 3 |
2 files changed, 24 insertions, 38 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 842967780b..93edb42bf4 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -158,19 +158,6 @@ void ASTRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) { UpdateAlignment(Ctx.Target.getPointerAlign(0)); } -uint64_t ASTRecordLayoutBuilder::getBaseOffset(const CXXRecordDecl *Base) { - ASTRecordLayout::BaseOffsetsMapTy::iterator I = Bases.find(Base); - if (I != Bases.end()) - return I->second; - - I = VBases.find(Base); - if (I != VBases.end()) - return I->second; - - assert(0 && "missing base"); - return 0; -} - void ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) { // First, determine the primary base class. @@ -181,7 +168,7 @@ ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) { if (PrimaryBase.isVirtual()) { // We have a virtual primary base, insert it as an indirect primary base. IndirectPrimaryBases.insert(Base); - + LayoutVirtualBase(Base); } else LayoutNonVirtualBase(Base); @@ -221,7 +208,7 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD, uint64_t Offset, const CXXRecordDecl *MostDerivedClass) { const CXXRecordDecl *PrimaryBase; - + if (MostDerivedClass == RD) PrimaryBase = this->PrimaryBase.getBase(); else { @@ -238,28 +225,30 @@ ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD, cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); if (I->isVirtual()) { - if (Base == PrimaryBase) { + bool IndirectPrimaryBase = IndirectPrimaryBases.count(Base); + + // We only want to visit this virtual base if it's either a primary base, + // or not an indirect primary base. + if (Base == PrimaryBase || !IndirectPrimaryBase) { // Only lay things out once. - if (VisitedVirtualBases.count(Base)) + if (!VisitedVirtualBases.insert(Base)) continue; - // Mark it so we don't lay it out twice. - VisitedVirtualBases.insert(Base); - assert (IndirectPrimaryBases.count(Base) && "IndirectPrimary was wrong"); - - if (!VBases.insert(std::make_pair(Base, Offset)).second) { - // FIXME: Enable this assertion. - // assert(false && "Added same vbase offset more than once!"); + + if (Base == PrimaryBase) { + assert(IndirectPrimaryBase && + "Base is supposed to be an indirect primary base!"); + + // We only want to add a vbase offset if this primary base is not the + // primary base of the most derived class. + if (PrimaryBase != this->PrimaryBase.getBase() || + !this->PrimaryBase.isVirtual()) { + if (!VBases.insert(std::make_pair(Base, Offset)).second) + assert(false && "Added same vbase offset more than once!"); + } + } else { + // We actually do want to lay out this base. + LayoutVirtualBase(Base); } - } else if (IndirectPrimaryBases.count(Base)) { - // Someone else will eventually lay this out. - ; - } else { - // Only lay things out once. - if (VisitedVirtualBases.count(Base)) - continue; - // Mark it so we don't lay it out twice. - VisitedVirtualBases.insert(Base); - LayoutVirtualBase(Base); } } @@ -506,7 +495,7 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { NonVirtualSize = Size; NonVirtualAlignment = Alignment; - // If this is a C++ clas, lay out its virtual bases. + // If this is a C++ class, lay out its virtual bases. if (RD) LayoutVirtualBases(RD, 0, RD); diff --git a/lib/AST/RecordLayoutBuilder.h b/lib/AST/RecordLayoutBuilder.h index 79f1ef652f..a4bce75312 100644 --- a/lib/AST/RecordLayoutBuilder.h +++ b/lib/AST/RecordLayoutBuilder.h @@ -143,9 +143,6 @@ class ASTRecordLayoutBuilder { /// given offset. void UpdateEmptyClassOffsets(const FieldDecl *FD, uint64_t Offset); - /// getBaseOffset - Get the offset of a direct base class. - uint64_t getBaseOffset(const CXXRecordDecl *Base); - /// FinishLayout - Finalize record layout. Adjust record size based on the /// alignment. void FinishLayout(); |