@@ -2545,10 +2545,7 @@ struct MicrosoftRecordLayoutBuilder {
2545
2545
CharUnits Alignment;
2546
2546
};
2547
2547
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) {}
2552
2549
private:
2553
2550
MicrosoftRecordLayoutBuilder (const MicrosoftRecordLayoutBuilder &) = delete ;
2554
2551
void operator =(const MicrosoftRecordLayoutBuilder &) = delete ;
@@ -2598,8 +2595,6 @@ struct MicrosoftRecordLayoutBuilder {
2598
2595
llvm::SmallPtrSetImpl<const CXXRecordDecl *> &HasVtorDispSet,
2599
2596
const CXXRecordDecl *RD) const ;
2600
2597
const ASTContext &Context;
2601
- EmptySubobjectMap *EmptySubobjects;
2602
-
2603
2598
// / The size of the record being laid out.
2604
2599
CharUnits Size ;
2605
2600
// / The non-virtual size of the record layout.
@@ -2913,7 +2908,8 @@ static bool recordUsesEBO(const RecordDecl *RD) {
2913
2908
}
2914
2909
2915
2910
void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase (
2916
- const CXXRecordDecl *RD, const CXXRecordDecl *BaseDecl,
2911
+ const CXXRecordDecl *RD,
2912
+ const CXXRecordDecl *BaseDecl,
2917
2913
const ASTRecordLayout &BaseLayout,
2918
2914
const ASTRecordLayout *&PreviousBaseLayout) {
2919
2915
// Insert padding between two bases if the left first one is zero sized or
@@ -2946,7 +2942,6 @@ void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(
2946
2942
}
2947
2943
Bases.insert (std::make_pair (BaseDecl, BaseOffset));
2948
2944
Size += BaseLayout.getNonVirtualSize ();
2949
- DataSize = Size ;
2950
2945
PreviousBaseLayout = &BaseLayout;
2951
2946
}
2952
2947
@@ -2964,43 +2959,15 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
2964
2959
LastFieldIsNonZeroWidthBitfield = false ;
2965
2960
ElementInfo Info = getAdjustedElementInfo (FD);
2966
2961
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)
2975
2964
FieldOffset =
2976
2965
Context.toCharUnitsFromBits (External.getExternalFieldOffset (FD));
2977
- } else if (IsUnion) {
2966
+ else if (IsUnion)
2978
2967
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
2997
2969
FieldOffset = Size .alignTo (Info.Alignment );
2998
- }
2999
2970
placeFieldAtOffset (FieldOffset);
3000
-
3001
- if (!IsOverlappingEmptyField)
3002
- DataSize = std::max (DataSize, FieldOffset + Info.Size );
3003
-
3004
2971
Size = std::max (Size , FieldOffset + Info.Size );
3005
2972
}
3006
2973
@@ -3046,7 +3013,6 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
3046
3013
Alignment = std::max (Alignment, Info.Alignment );
3047
3014
RemainingBitsInField = Context.toBits (Info.Size ) - Width;
3048
3015
}
3049
- DataSize = Size ;
3050
3016
}
3051
3017
3052
3018
void
@@ -3072,7 +3038,6 @@ MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {
3072
3038
Size = FieldOffset;
3073
3039
Alignment = std::max (Alignment, Info.Alignment );
3074
3040
}
3075
- DataSize = Size ;
3076
3041
}
3077
3042
3078
3043
void MicrosoftRecordLayoutBuilder::injectVBPtr (const CXXRecordDecl *RD) {
@@ -3339,9 +3304,8 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
3339
3304
const ASTRecordLayout *NewEntry = nullptr ;
3340
3305
3341
3306
if (isMsLayout (*this )) {
3307
+ MicrosoftRecordLayoutBuilder Builder (*this );
3342
3308
if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3343
- EmptySubobjectMap EmptySubobjects (*this , RD);
3344
- MicrosoftRecordLayoutBuilder Builder (*this , &EmptySubobjects);
3345
3309
Builder.cxxLayout (RD);
3346
3310
NewEntry = new (*this ) ASTRecordLayout (
3347
3311
*this , Builder.Size , Builder.Alignment , Builder.Alignment ,
@@ -3353,7 +3317,6 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
3353
3317
Builder.EndsWithZeroSizedObject , Builder.LeadsWithZeroSizedBase ,
3354
3318
Builder.Bases , Builder.VBases );
3355
3319
} else {
3356
- MicrosoftRecordLayoutBuilder Builder (*this , /* EmptySubobjects=*/ nullptr );
3357
3320
Builder.layout (D);
3358
3321
NewEntry = new (*this ) ASTRecordLayout (
3359
3322
*this , Builder.Size , Builder.Alignment , Builder.Alignment ,
0 commit comments