@@ -2274,9 +2274,9 @@ static unsigned getPaddingDiagFromTagKind(TagTypeKind Tag) {
2274
2274
}
2275
2275
}
2276
2276
2277
- static void CheckFieldPadding (const ASTContext &Context, bool IsUnion,
2278
- uint64_t Offset, uint64_t UnpaddedOffset,
2279
- const FieldDecl *D) {
2277
+ void ItaniumRecordLayoutBuilder:: CheckFieldPadding (
2278
+ uint64_t Offset, uint64_t UnpaddedOffset, uint64_t UnpackedOffset ,
2279
+ unsigned UnpackedAlign, bool isPacked, const FieldDecl *D) {
2280
2280
// We let objc ivars without warning, objc interfaces generally are not used
2281
2281
// for padding tricks.
2282
2282
if (isa<ObjCIvarDecl>(D))
@@ -2300,31 +2300,23 @@ static void CheckFieldPadding(const ASTContext &Context, bool IsUnion,
2300
2300
if (D->getIdentifier ()) {
2301
2301
auto Diagnostic = D->isBitField () ? diag::warn_padded_struct_bitfield
2302
2302
: diag::warn_padded_struct_field;
2303
- Context.getDiagnostics ().Report (D->getLocation (),
2304
- Diagnostic)
2303
+ Diag (D->getLocation (), Diagnostic)
2305
2304
<< getPaddingDiagFromTagKind (D->getParent ()->getTagKind ())
2306
2305
<< Context.getTypeDeclType (D->getParent ()) << PadSize
2307
2306
<< (InBits ? 1 : 0 ) // (byte|bit)
2308
2307
<< D->getIdentifier ();
2309
2308
} else {
2310
2309
auto Diagnostic = D->isBitField () ? diag::warn_padded_struct_anon_bitfield
2311
2310
: diag::warn_padded_struct_anon_field;
2312
- Context.getDiagnostics ().Report (D->getLocation (),
2313
- Diagnostic)
2311
+ Diag (D->getLocation (), Diagnostic)
2314
2312
<< getPaddingDiagFromTagKind (D->getParent ()->getTagKind ())
2315
2313
<< Context.getTypeDeclType (D->getParent ()) << PadSize
2316
2314
<< (InBits ? 1 : 0 ); // (byte|bit)
2317
2315
}
2318
- }
2319
- }
2320
-
2321
- void ItaniumRecordLayoutBuilder::CheckFieldPadding (
2322
- uint64_t Offset, uint64_t UnpaddedOffset, uint64_t UnpackedOffset,
2323
- unsigned UnpackedAlign, bool isPacked, const FieldDecl *D) {
2324
- ::CheckFieldPadding (Context, IsUnion, Offset, UnpaddedOffset, D);
2325
- if (isPacked && Offset != UnpackedOffset) {
2326
- HasPackedField = true ;
2327
- }
2316
+ }
2317
+ if (isPacked && Offset != UnpackedOffset) {
2318
+ HasPackedField = true ;
2319
+ }
2328
2320
}
2329
2321
2330
2322
static const CXXMethodDecl *computeKeyFunction (ASTContext &Context,
@@ -2650,6 +2642,8 @@ struct MicrosoftRecordLayoutBuilder {
2650
2642
// / virtual base classes and their offsets in the record.
2651
2643
ASTRecordLayout::VBaseOffsetsMapTy VBases;
2652
2644
// / The number of remaining bits in our last bitfield allocation.
2645
+ // / This value isn't meaningful unless LastFieldIsNonZeroWidthBitfield is
2646
+ // / true.
2653
2647
unsigned RemainingBitsInField;
2654
2648
bool IsUnion : 1 ;
2655
2649
// / True if the last field laid out was a bitfield and was not 0
@@ -3010,15 +3004,6 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
3010
3004
} else {
3011
3005
FieldOffset = Size .alignTo (Info.Alignment );
3012
3006
}
3013
-
3014
- uint64_t UnpaddedFielddOffsetInBits =
3015
- Context.toBits (DataSize) - RemainingBitsInField;
3016
-
3017
- ::CheckFieldPadding (Context, IsUnion, Context.toBits(FieldOffset),
3018
- UnpaddedFielddOffsetInBits, FD);
3019
-
3020
- RemainingBitsInField = 0 ;
3021
-
3022
3007
placeFieldAtOffset (FieldOffset);
3023
3008
3024
3009
if (!IsOverlappingEmptyField)
@@ -3064,14 +3049,10 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
3064
3049
} else {
3065
3050
// Allocate a new block of memory and place the bitfield in it.
3066
3051
CharUnits FieldOffset = Size .alignTo (Info.Alignment );
3067
- uint64_t UnpaddedFieldOffsetInBits =
3068
- Context.toBits (DataSize) - RemainingBitsInField;
3069
3052
placeFieldAtOffset (FieldOffset);
3070
3053
Size = FieldOffset + Info.Size ;
3071
3054
Alignment = std::max (Alignment, Info.Alignment );
3072
3055
RemainingBitsInField = Context.toBits (Info.Size ) - Width;
3073
- ::CheckFieldPadding (Context, IsUnion, Context.toBits(FieldOffset),
3074
- UnpaddedFieldOffsetInBits, FD);
3075
3056
}
3076
3057
DataSize = Size ;
3077
3058
}
@@ -3095,14 +3076,9 @@ MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {
3095
3076
} else {
3096
3077
// Round up the current record size to the field's alignment boundary.
3097
3078
CharUnits FieldOffset = Size .alignTo (Info.Alignment );
3098
- uint64_t UnpaddedFieldOffsetInBits =
3099
- Context.toBits (DataSize) - RemainingBitsInField;
3100
3079
placeFieldAtOffset (FieldOffset);
3101
- RemainingBitsInField = 0 ;
3102
3080
Size = FieldOffset;
3103
3081
Alignment = std::max (Alignment, Info.Alignment );
3104
- ::CheckFieldPadding (Context, IsUnion, Context.toBits(FieldOffset),
3105
- UnpaddedFieldOffsetInBits, FD);
3106
3082
}
3107
3083
DataSize = Size ;
3108
3084
}
@@ -3227,9 +3203,6 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
3227
3203
}
3228
3204
3229
3205
void MicrosoftRecordLayoutBuilder::finalizeLayout (const RecordDecl *RD) {
3230
- uint64_t UnpaddedSizeInBits = Context.toBits (DataSize);
3231
- UnpaddedSizeInBits -= RemainingBitsInField;
3232
-
3233
3206
// Respect required alignment. Note that in 32-bit mode Required alignment
3234
3207
// may be 0 and cause size not to be updated.
3235
3208
DataSize = Size ;
@@ -3258,22 +3231,6 @@ void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
3258
3231
Size = Context.toCharUnitsFromBits (External.Size );
3259
3232
if (External.Align )
3260
3233
Alignment = Context.toCharUnitsFromBits (External.Align );
3261
- return ;
3262
- }
3263
- unsigned CharBitNum = Context.getTargetInfo ().getCharWidth ();
3264
- uint64_t SizeInBits = Context.toBits (Size );
3265
- if (SizeInBits > UnpaddedSizeInBits) {
3266
- unsigned int PadSize = SizeInBits - UnpaddedSizeInBits;
3267
- bool InBits = true ;
3268
- if (PadSize % CharBitNum == 0 ) {
3269
- PadSize = PadSize / CharBitNum;
3270
- InBits = false ;
3271
- }
3272
-
3273
- Context.getDiagnostics ().Report (RD->getLocation (),
3274
- diag::warn_padded_struct_size)
3275
- << Context.getTypeDeclType (RD) << PadSize
3276
- << (InBits ? 1 : 0 ); // (byte|bit)
3277
3234
}
3278
3235
}
3279
3236
0 commit comments