@@ -2545,10 +2545,7 @@ struct MicrosoftRecordLayoutBuilder {
25452545 CharUnits Alignment;
25462546 };
25472547 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
2548- MicrosoftRecordLayoutBuilder (const ASTContext &Context,
2549- EmptySubobjectMap *EmptySubobjects)
2550- : Context(Context), EmptySubobjects(EmptySubobjects) {}
2551-
2548+ MicrosoftRecordLayoutBuilder (const ASTContext &Context) : Context(Context) {}
25522549private:
25532550 MicrosoftRecordLayoutBuilder (const MicrosoftRecordLayoutBuilder &) = delete ;
25542551 void operator =(const MicrosoftRecordLayoutBuilder &) = delete ;
@@ -2598,8 +2595,6 @@ struct MicrosoftRecordLayoutBuilder {
25982595 llvm::SmallPtrSetImpl<const CXXRecordDecl *> &HasVtorDispSet,
25992596 const CXXRecordDecl *RD) const ;
26002597 const ASTContext &Context;
2601- EmptySubobjectMap *EmptySubobjects;
2602-
26032598 // / The size of the record being laid out.
26042599 CharUnits Size;
26052600 // / The non-virtual size of the record layout.
@@ -2913,7 +2908,8 @@ static bool recordUsesEBO(const RecordDecl *RD) {
29132908}
29142909
29152910void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase (
2916- const CXXRecordDecl *RD, const CXXRecordDecl *BaseDecl,
2911+ const CXXRecordDecl *RD,
2912+ const CXXRecordDecl *BaseDecl,
29172913 const ASTRecordLayout &BaseLayout,
29182914 const ASTRecordLayout *&PreviousBaseLayout) {
29192915 // Insert padding between two bases if the left first one is zero sized or
@@ -2946,7 +2942,6 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(
29462942 }
29472943 Bases.insert (std::make_pair (BaseDecl, BaseOffset));
29482944 Size += BaseLayout.getNonVirtualSize ();
2949- DataSize = Size;
29502945 PreviousBaseLayout = &BaseLayout;
29512946}
29522947
@@ -2964,43 +2959,15 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
29642959 LastFieldIsNonZeroWidthBitfield = false ;
29652960 ElementInfo Info = getAdjustedElementInfo (FD);
29662961 Alignment = std::max (Alignment, Info.Alignment );
2967-
2968- const CXXRecordDecl *FieldClass = FD->getType ()->getAsCXXRecordDecl ();
2969- bool IsOverlappingEmptyField = FD->isPotentiallyOverlapping () &&
2970- FieldClass->isEmpty () &&
2971- FieldClass->fields ().empty ();
2972- CharUnits FieldOffset = CharUnits::Zero ();
2973-
2974- if (UseExternalLayout) {
2962+ CharUnits FieldOffset;
2963+ if (UseExternalLayout)
29752964 FieldOffset =
29762965 Context.toCharUnitsFromBits (External.getExternalFieldOffset (FD));
2977- } else if (IsUnion) {
2966+ else if (IsUnion)
29782967 FieldOffset = CharUnits::Zero ();
2979- } else if (EmptySubobjects) {
2980- if (!IsOverlappingEmptyField)
2981- FieldOffset = DataSize.alignTo (Info.Alignment );
2982-
2983- while (!EmptySubobjects->CanPlaceFieldAtOffset (FD, FieldOffset)) {
2984- const CXXRecordDecl *ParentClass = cast<CXXRecordDecl>(FD->getParent ());
2985- bool HasBases = ParentClass && (!ParentClass->bases ().empty () ||
2986- !ParentClass->vbases ().empty ());
2987- if (FieldOffset == CharUnits::Zero () && DataSize != CharUnits::Zero () &&
2988- HasBases) {
2989- // MSVC appears to only do this when there are base classes;
2990- // otherwise it overlaps no_unique_address fields in non-zero offsets.
2991- FieldOffset = DataSize.alignTo (Info.Alignment );
2992- } else {
2993- FieldOffset += Info.Alignment ;
2994- }
2995- }
2996- } else {
2968+ else
29972969 FieldOffset = Size.alignTo (Info.Alignment );
2998- }
29992970 placeFieldAtOffset (FieldOffset);
3000-
3001- if (!IsOverlappingEmptyField)
3002- DataSize = std::max (DataSize, FieldOffset + Info.Size );
3003-
30042971 Size = std::max (Size, FieldOffset + Info.Size );
30052972}
30062973
@@ -3046,7 +3013,6 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
30463013 Alignment = std::max (Alignment, Info.Alignment );
30473014 RemainingBitsInField = Context.toBits (Info.Size ) - Width;
30483015 }
3049- DataSize = Size;
30503016}
30513017
30523018void
@@ -3072,7 +3038,6 @@ MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {
30723038 Size = FieldOffset;
30733039 Alignment = std::max (Alignment, Info.Alignment );
30743040 }
3075- DataSize = Size;
30763041}
30773042
30783043void MicrosoftRecordLayoutBuilder::injectVBPtr (const CXXRecordDecl *RD) {
@@ -3339,9 +3304,8 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
33393304 const ASTRecordLayout *NewEntry = nullptr ;
33403305
33413306 if (isMsLayout (*this )) {
3307+ MicrosoftRecordLayoutBuilder Builder (*this );
33423308 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3343- EmptySubobjectMap EmptySubobjects (*this , RD);
3344- MicrosoftRecordLayoutBuilder Builder (*this , &EmptySubobjects);
33453309 Builder.cxxLayout (RD);
33463310 NewEntry = new (*this ) ASTRecordLayout (
33473311 *this , Builder.Size , Builder.Alignment , Builder.Alignment ,
@@ -3353,7 +3317,6 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
33533317 Builder.EndsWithZeroSizedObject , Builder.LeadsWithZeroSizedBase ,
33543318 Builder.Bases , Builder.VBases );
33553319 } else {
3356- MicrosoftRecordLayoutBuilder Builder (*this , /* EmptySubobjects=*/ nullptr );
33573320 Builder.layout (D);
33583321 NewEntry = new (*this ) ASTRecordLayout (
33593322 *this , Builder.Size , Builder.Alignment , Builder.Alignment ,
0 commit comments