Skip to content

Commit 8b6ff9c

Browse files
committed
[NFC] Assert that extra data size matches extra data pattern and offset.
To prevent the fix for rdar://problem/68997282 from regressing, assert that the size of the extra data patterns for generic enums and structs combined with the corresponding offsets matches the size passed from the generic metadata instantiation function to swift_allocateGenericValueMetadata.
1 parent 4dfaa77 commit 8b6ff9c

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4160,13 +4160,18 @@ namespace {
41604160
ConstantStructBuilder &B)
41614161
: super(IGM, theStruct, B) {}
41624162

4163+
Size getExtraDataSize(StructMetadataLayout &layout) {
4164+
auto extraSize = layout.getSize().getOffsetToEnd() -
4165+
IGM.getOffsetOfStructTypeSpecificMetadataMembers();
4166+
return extraSize;
4167+
}
4168+
41634169
llvm::Value *emitAllocateMetadata(IRGenFunction &IGF,
41644170
llvm::Value *descriptor,
41654171
llvm::Value *arguments,
41664172
llvm::Value *templatePointer) {
41674173
auto &layout = IGM.getMetadataLayout(Target);
4168-
auto extraSize = layout.getSize().getOffsetToEnd()
4169-
- IGM.getOffsetOfStructTypeSpecificMetadataMembers();
4174+
auto extraSize = getExtraDataSize(layout);
41704175
auto extraSizeV = IGM.getSize(extraSize);
41714176

41724177
// Sign the descriptor.
@@ -4279,10 +4284,9 @@ namespace {
42794284
Offset zeroingEnd = offsetUpToTrailingFlags
42804285
? layout.getTrailingFlagsOffset()
42814286
: layout.getFieldOffsetVectorOffset();
4282-
return { global,
4283-
zeroingEnd.getStatic()
4284-
- zeroingStart,
4285-
structSize };
4287+
auto offset = zeroingEnd.getStatic() - zeroingStart;
4288+
assert((offset + structSize) == getExtraDataSize(layout));
4289+
return {global, offset, structSize};
42864290
}
42874291

42884292
bool hasCompletionFunction() {
@@ -4558,13 +4562,18 @@ namespace {
45584562
ConstantStructBuilder &B)
45594563
: super(IGM, theEnum, B) {}
45604564

4565+
Size getExtraDataSize(EnumMetadataLayout &layout) {
4566+
auto size = layout.getSize().getOffsetToEnd() -
4567+
IGM.getOffsetOfEnumTypeSpecificMetadataMembers();
4568+
return size;
4569+
}
4570+
45614571
llvm::Value *emitAllocateMetadata(IRGenFunction &IGF,
45624572
llvm::Value *descriptor,
45634573
llvm::Value *arguments,
45644574
llvm::Value *templatePointer) {
45654575
auto &layout = IGM.getMetadataLayout(Target);
4566-
auto extraSize = layout.getSize().getOffsetToEnd()
4567-
- IGM.getOffsetOfEnumTypeSpecificMetadataMembers();
4576+
auto extraSize = getExtraDataSize(layout);
45684577
auto extraSizeV = IGM.getSize(extraSize);
45694578

45704579
// Sign the descriptor.
@@ -4625,10 +4634,9 @@ namespace {
46254634
Offset zeroingEnd = offsetUpToTrailingFlags
46264635
? layout.getTrailingFlagsOffset()
46274636
: layout.getPayloadSizeOffset();
4628-
return { global,
4629-
zeroingEnd.getStatic()
4630-
- zeroingStart,
4631-
structSize };
4637+
auto offset = zeroingEnd.getStatic() - zeroingStart;
4638+
assert((offset + structSize) == getExtraDataSize(layout));
4639+
return {global, offset, structSize};
46324640
}
46334641

46344642
llvm::Constant *emitNominalTypeDescriptor() {

0 commit comments

Comments
 (0)