From: Anders Carlsson Date: Thu, 11 Mar 2010 02:41:30 +0000 (+0000) Subject: More record layout builder cleanup. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=23a5fcba194c3dec737f296860d75327d85cc349;p=clang More record layout builder cleanup. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98229 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 12e9f04512..eab4f11137 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -221,8 +221,7 @@ void ASTRecordLayoutBuilder::LayoutNonVirtualBase(const CXXRecordDecl *RD) { void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class, const CXXRecordDecl *RD, const CXXRecordDecl *PB, - uint64_t Offset, - llvm::SmallSet &mark) { + uint64_t Offset) { for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), e = RD->bases_end(); i != e; ++i) { assert(!i->getType()->isDependentType() && @@ -233,10 +232,10 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class, if (i->isVirtual()) { if (Base == PB) { // Only lay things out once. - if (mark.count(Base)) + if (VisitedVirtualBases.count(Base)) continue; // Mark it so we don't lay it out twice. - mark.insert(Base); + VisitedVirtualBases.insert(Base); assert (IndirectPrimaryBases.count(Base) && "IndirectPrimary was wrong"); VBases.push_back(std::make_pair(Base, Offset)); } else if (IndirectPrimaryBases.count(Base)) { @@ -244,10 +243,10 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class, ; } else { // Only lay things out once. - if (mark.count(Base)) + if (VisitedVirtualBases.count(Base)) continue; // Mark it so we don't lay it out twice. - mark.insert(Base); + VisitedVirtualBases.insert(Base); LayoutVirtualBase(Base); BaseOffset = VBases.back().second; } @@ -263,7 +262,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class, if (Base->getNumVBases()) { const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Base); const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().getBase(); - LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset, mark); + LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset); } } } @@ -486,8 +485,7 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { NonVirtualAlignment = Alignment; if (RD) { - llvm::SmallSet mark; - LayoutVirtualBases(RD, RD, PrimaryBase.getBase(), 0, mark); + LayoutVirtualBases(RD, RD, PrimaryBase.getBase(), 0); } // Finally, round the size of the total struct up to the alignment of the diff --git a/lib/AST/RecordLayoutBuilder.h b/lib/AST/RecordLayoutBuilder.h index 80bf49d051..ae3182a6a6 100644 --- a/lib/AST/RecordLayoutBuilder.h +++ b/lib/AST/RecordLayoutBuilder.h @@ -77,6 +77,10 @@ class ASTRecordLayoutBuilder { /// inheritance graph order. Used for determining the primary base class. const CXXRecordDecl *FirstNearlyEmptyVBase; + /// VisitedVirtualBases - A set of all the visited virtual bases, used to + /// avoid visiting virtual bases more than once. + llvm::SmallPtrSet VisitedVirtualBases; + /// EmptyClassOffsets - A map from offsets to empty record decls. typedef std::multimap EmptyClassOffsetsTy; EmptyClassOffsetsTy EmptyClassOffsets; @@ -113,8 +117,7 @@ class ASTRecordLayoutBuilder { /// LayoutVirtualBases - Lays out all the virtual bases. void LayoutVirtualBases(const CXXRecordDecl *Class, const CXXRecordDecl *RD, - const CXXRecordDecl *PB, uint64_t Offset, - llvm::SmallSet &mark); + const CXXRecordDecl *PB, uint64_t Offset); /// LayoutVirtualBase - Lays out a single virtual base. void LayoutVirtualBase(const CXXRecordDecl *RD);