@@ -4160,13 +4160,18 @@ namespace {
4160
4160
ConstantStructBuilder &B)
4161
4161
: super(IGM, theStruct, B) {}
4162
4162
4163
+ Size getExtraDataSize (StructMetadataLayout &layout) {
4164
+ auto extraSize = layout.getSize ().getOffsetToEnd () -
4165
+ IGM.getOffsetOfStructTypeSpecificMetadataMembers ();
4166
+ return extraSize;
4167
+ }
4168
+
4163
4169
llvm::Value *emitAllocateMetadata (IRGenFunction &IGF,
4164
4170
llvm::Value *descriptor,
4165
4171
llvm::Value *arguments,
4166
4172
llvm::Value *templatePointer) {
4167
4173
auto &layout = IGM.getMetadataLayout (Target);
4168
- auto extraSize = layout.getSize ().getOffsetToEnd ()
4169
- - IGM.getOffsetOfStructTypeSpecificMetadataMembers ();
4174
+ auto extraSize = getExtraDataSize (layout);
4170
4175
auto extraSizeV = IGM.getSize (extraSize);
4171
4176
4172
4177
// Sign the descriptor.
@@ -4234,6 +4239,7 @@ namespace {
4234
4239
PartialPattern buildExtraDataPattern () {
4235
4240
ConstantInitBuilder builder (IGM);
4236
4241
auto init = builder.beginStruct ();
4242
+ init.setPacked (true );
4237
4243
4238
4244
struct Scanner : StructMetadataScanner<Scanner> {
4239
4245
GenericStructMetadataBuilder &Outer;
@@ -4278,10 +4284,9 @@ namespace {
4278
4284
Offset zeroingEnd = offsetUpToTrailingFlags
4279
4285
? layout.getTrailingFlagsOffset ()
4280
4286
: layout.getFieldOffsetVectorOffset ();
4281
- return { global,
4282
- zeroingEnd.getStatic ()
4283
- - zeroingStart,
4284
- structSize };
4287
+ auto offset = zeroingEnd.getStatic () - zeroingStart;
4288
+ assert ((offset + structSize) == getExtraDataSize (layout));
4289
+ return {global, offset, structSize};
4285
4290
}
4286
4291
4287
4292
bool hasCompletionFunction () {
@@ -4557,13 +4562,18 @@ namespace {
4557
4562
ConstantStructBuilder &B)
4558
4563
: super(IGM, theEnum, B) {}
4559
4564
4565
+ Size getExtraDataSize (EnumMetadataLayout &layout) {
4566
+ auto size = layout.getSize ().getOffsetToEnd () -
4567
+ IGM.getOffsetOfEnumTypeSpecificMetadataMembers ();
4568
+ return size;
4569
+ }
4570
+
4560
4571
llvm::Value *emitAllocateMetadata (IRGenFunction &IGF,
4561
4572
llvm::Value *descriptor,
4562
4573
llvm::Value *arguments,
4563
4574
llvm::Value *templatePointer) {
4564
4575
auto &layout = IGM.getMetadataLayout (Target);
4565
- auto extraSize = layout.getSize ().getOffsetToEnd ()
4566
- - IGM.getOffsetOfEnumTypeSpecificMetadataMembers ();
4576
+ auto extraSize = getExtraDataSize (layout);
4567
4577
auto extraSizeV = IGM.getSize (extraSize);
4568
4578
4569
4579
// Sign the descriptor.
@@ -4602,6 +4612,7 @@ namespace {
4602
4612
PartialPattern buildExtraDataPattern () {
4603
4613
ConstantInitBuilder builder (IGM);
4604
4614
auto init = builder.beginStruct ();
4615
+ init.setPacked (true );
4605
4616
4606
4617
auto &layout = IGM.getMetadataLayout (Target);
4607
4618
@@ -4623,10 +4634,9 @@ namespace {
4623
4634
Offset zeroingEnd = offsetUpToTrailingFlags
4624
4635
? layout.getTrailingFlagsOffset ()
4625
4636
: layout.getPayloadSizeOffset ();
4626
- return { global,
4627
- zeroingEnd.getStatic ()
4628
- - zeroingStart,
4629
- structSize };
4637
+ auto offset = zeroingEnd.getStatic () - zeroingStart;
4638
+ assert ((offset + structSize) == getExtraDataSize (layout));
4639
+ return {global, offset, structSize};
4630
4640
}
4631
4641
4632
4642
llvm::Constant *emitNominalTypeDescriptor () {
0 commit comments