Skip to content

[IRGen] Pack extra data pattern structs. #34822

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 22 additions & 12 deletions lib/IRGen/GenMeta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4160,13 +4160,18 @@ namespace {
ConstantStructBuilder &B)
: super(IGM, theStruct, B) {}

Size getExtraDataSize(StructMetadataLayout &layout) {
auto extraSize = layout.getSize().getOffsetToEnd() -
IGM.getOffsetOfStructTypeSpecificMetadataMembers();
return extraSize;
}

llvm::Value *emitAllocateMetadata(IRGenFunction &IGF,
llvm::Value *descriptor,
llvm::Value *arguments,
llvm::Value *templatePointer) {
auto &layout = IGM.getMetadataLayout(Target);
auto extraSize = layout.getSize().getOffsetToEnd()
- IGM.getOffsetOfStructTypeSpecificMetadataMembers();
auto extraSize = getExtraDataSize(layout);
auto extraSizeV = IGM.getSize(extraSize);

// Sign the descriptor.
Expand Down Expand Up @@ -4234,6 +4239,7 @@ namespace {
PartialPattern buildExtraDataPattern() {
ConstantInitBuilder builder(IGM);
auto init = builder.beginStruct();
init.setPacked(true);

struct Scanner : StructMetadataScanner<Scanner> {
GenericStructMetadataBuilder &Outer;
Expand Down Expand Up @@ -4278,10 +4284,9 @@ namespace {
Offset zeroingEnd = offsetUpToTrailingFlags
? layout.getTrailingFlagsOffset()
: layout.getFieldOffsetVectorOffset();
return { global,
zeroingEnd.getStatic()
- zeroingStart,
structSize };
auto offset = zeroingEnd.getStatic() - zeroingStart;
assert((offset + structSize) == getExtraDataSize(layout));
return {global, offset, structSize};
}

bool hasCompletionFunction() {
Expand Down Expand Up @@ -4557,13 +4562,18 @@ namespace {
ConstantStructBuilder &B)
: super(IGM, theEnum, B) {}

Size getExtraDataSize(EnumMetadataLayout &layout) {
auto size = layout.getSize().getOffsetToEnd() -
IGM.getOffsetOfEnumTypeSpecificMetadataMembers();
return size;
}

llvm::Value *emitAllocateMetadata(IRGenFunction &IGF,
llvm::Value *descriptor,
llvm::Value *arguments,
llvm::Value *templatePointer) {
auto &layout = IGM.getMetadataLayout(Target);
auto extraSize = layout.getSize().getOffsetToEnd()
- IGM.getOffsetOfEnumTypeSpecificMetadataMembers();
auto extraSize = getExtraDataSize(layout);
auto extraSizeV = IGM.getSize(extraSize);

// Sign the descriptor.
Expand Down Expand Up @@ -4602,6 +4612,7 @@ namespace {
PartialPattern buildExtraDataPattern() {
ConstantInitBuilder builder(IGM);
auto init = builder.beginStruct();
init.setPacked(true);

auto &layout = IGM.getMetadataLayout(Target);

Expand All @@ -4623,10 +4634,9 @@ namespace {
Offset zeroingEnd = offsetUpToTrailingFlags
? layout.getTrailingFlagsOffset()
: layout.getPayloadSizeOffset();
return { global,
zeroingEnd.getStatic()
- zeroingStart,
structSize };
auto offset = zeroingEnd.getStatic() - zeroingStart;
assert((offset + structSize) == getExtraDataSize(layout));
return {global, offset, structSize};
}

llvm::Constant *emitNominalTypeDescriptor() {
Expand Down
4 changes: 4 additions & 0 deletions stdlib/public/runtime/Metadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,10 @@ swift::swift_allocateGenericValueMetadata(const ValueTypeDescriptor *description
"enum metadata header unexpectedly has extra members");
static_assert(sizeof(EnumMetadata) == sizeof(ValueMetadata),
"enum metadata unexpectedly has extra members");
assert(!pattern->hasExtraDataPattern() ||
(extraDataSize == (pattern->getExtraDataPattern()->OffsetInWords +
pattern->getExtraDataPattern()->SizeInWords) *
sizeof(void *)));

size_t totalSize = sizeof(FullMetadata<ValueMetadata>) + extraDataSize;

Expand Down
4 changes: 2 additions & 2 deletions test/IRGen/enum_value_semantics_future.sil
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ enum GenericFixedLayout<T> {
// CHECK-SAME: }>

// CHECK: @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" = internal constant %swift.enum_vwtable
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant { i64 } zeroinitializer
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ i64 }> zeroinitializer

// CHECK-LABEL: @"$s27enum_value_semantics_future18GenericFixedLayoutOMn" = hidden constant
// CHECK-SAME: [16 x i8*]* @"$s27enum_value_semantics_future18GenericFixedLayoutOMI"
Expand All @@ -177,7 +177,7 @@ enum GenericFixedLayout<T> {
// Value witness table.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.enum_vwtable* @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, <{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
// Extra data pattern.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint ({ i64 }* [[EXTRA_DATA_PATTERN]] to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, <{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 4) to i64)) to i32)
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (<{ i64 }>* [[EXTRA_DATA_PATTERN]] to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, <{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 4) to i64)) to i32)
// CHECK-SAME: }>

sil @single_payload_nontrivial_copy_destroy : $(@owned SinglePayloadNontrivial) -> () {
Expand Down
4 changes: 2 additions & 2 deletions test/IRGen/generic_structs.sil
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Builtin

// -- Generic structs with fixed layout should have no completion function
// and emit the field offset vector as part of the pattern.
// CHECK: [[PATTERN:@.*]] = internal constant { i32, i32, i32, [4 x i8] } { i32 0, i32 1, i32 8, [4 x i8] zeroinitializer }, align 8
// CHECK: [[PATTERN:@.*]] = internal constant <{ i32, i32, i32, [4 x i8] }> <{ i32 0, i32 1, i32 8, [4 x i8] zeroinitializer }>, align 8
// CHECK-LABEL: @"$s15generic_structs18FixedLayoutGenericVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s15generic_structs18FixedLayoutGenericVMi"
Expand All @@ -19,7 +19,7 @@ import Builtin
// -- vwtable pointer
// CHECK-SAME: @"$s15generic_structs18FixedLayoutGenericVWV"
// -- extra data pattern
// CHECK-SAME: { i32, i32, i32, [4 x i8] }* [[PATTERN]]
// CHECK-SAME: <{ i32, i32, i32, [4 x i8] }>* [[PATTERN]]
// CHECK-SAME: i16 1,
// CHECK-SAME: i16 2 }>

Expand Down
4 changes: 2 additions & 2 deletions test/IRGen/generic_structs_future.sil
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Builtin

// -- Generic structs with fixed layout should have no completion function
// and emit the field offset vector as part of the pattern.
// CHECK: [[PATTERN:@.*]] = internal constant { i32, i32, i32, [4 x i8], i64 } { i32 0, i32 1, i32 8, [4 x i8] zeroinitializer, i64 0 }, align 8
// CHECK: [[PATTERN:@.*]] = internal constant <{ i32, i32, i32, [4 x i8], i64 }> <{ i32 0, i32 1, i32 8, [4 x i8] zeroinitializer, i64 0 }>, align 8
// CHECK-LABEL: @"$s22generic_structs_future18FixedLayoutGenericVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s22generic_structs_future18FixedLayoutGenericVMi"
Expand All @@ -20,7 +20,7 @@ import Builtin
// -- vwtable pointer
// CHECK-SAME: @"$s22generic_structs_future18FixedLayoutGenericVWV"
// -- extra data pattern
// CHECK-SAME: { i32, i32, i32, [4 x i8], i64 }* [[PATTERN]]
// CHECK-SAME: <{ i32, i32, i32, [4 x i8], i64 }>* [[PATTERN]]
// CHECK-SAME: i16 1,
// CHECK-SAME: i16 3 }>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// UNSUPPORTED: CPU=armv7 && OS=ios
// UNSUPPORTED: CPU=armv7s && OS=ios

// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant { i64 } zeroinitializer, align [[ALIGNMENT]]
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ i64 }> zeroinitializer, align [[ALIGNMENT]]

// CHECK: @"$s4main6EitherOMP" = internal constant <{
// : i32,
Expand Down Expand Up @@ -68,9 +68,9 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: {
// CHECK-SAME: <{
// CHECK-SAME: i64
// CHECK-SAME: }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
// UNSUPPORTED: CPU=armv7s && OS=ios


// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant { [[INT]] } {
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ [[INT]] }> <{
// The payload size is 8: the larger payload is the size of an Int64.
// CHECK-SAME: [[INT]] 8
// CHECK-SAME: }, align [[ALIGNMENT]]
// CHECK-SAME: }>, align [[ALIGNMENT]]


// CHECK: @"$s4main6EitherOMP" = internal constant <{
Expand Down Expand Up @@ -55,7 +55,7 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: { [[INT]] }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: <{ [[INT]] }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
// UNSUPPORTED: CPU=armv7s && OS=ios


// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant { [[INT]], i64 } {
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ [[INT]], i64 }> <{
// The payload size is 8: the larger payload is the size of an Int64.
// CHECK-SAME: [[INT]] 8,
// CHECK-SAME: i64 0
// CHECK-SAME: }, align [[ALIGNMENT]]
// CHECK-SAME: }>, align [[ALIGNMENT]]


// CHECK: @"$s4main6EitherOMP" = internal constant <{
Expand Down Expand Up @@ -56,7 +56,7 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: { [[INT]], i64 }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: <{ [[INT]], i64 }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
// UNSUPPORTED: CPU=armv7 && OS=ios
// UNSUPPORTED: CPU=armv7s && OS=ios

// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant {
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{
// CHECK-SAME: i32
// CHECK-SAME: , i32
// CHECK-SAME: , i32
// : , [4 x i8]
// CHECK-SAME: } {
// CHECK-SAME: }> <{
// CHECK-SAME: i32 0,
// CHECK-SAME: i32 8,
// CHECK-SAME: i32 16
// : , [4 x i8] zeroinitializer
// CHECK-SAME: }, align [[ALIGNMENT]]
// CHECK-SAME: }>, align [[ALIGNMENT]]
// CHECK: @"$s4main4PairVMP" = internal constant <{
// : i32,
// : i32,
Expand Down Expand Up @@ -60,11 +60,11 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: { i32
// CHECK-SAME: <{ i32
// CHECK-SAME: , i32
// CHECK-SAME: , i32
// : , [4 x i8]
// CHECK-SAME: }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
// UNSUPPORTED: CPU=armv7 && OS=ios
// UNSUPPORTED: CPU=armv7s && OS=ios

// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant {
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{
// CHECK-SAME: i32,
// CHECK-SAME: i32,
// CHECK-SAME: i32,
// : , [4 x i8],
// CHECK-SAME: i64
// CHECK-SAME: } {
// CHECK-SAME: }> <{
// CHECK-SAME: i32 0,
// CHECK-SAME: i32 8,
// CHECK-SAME: i32 16,
// : [4 x i8] zeroinitializer,
// CHECK-SAME: i64 0
// CHECK-SAME: }, align [[ALIGNMENT]]
// CHECK-SAME: }>, align [[ALIGNMENT]]
// CHECK: @"$s4main4PairVMP" = internal constant <{
// : i32,
// : i32,
Expand Down Expand Up @@ -62,13 +62,13 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: {
// CHECK-SAME: <{
// CHECK-SAME: i32,
// CHECK-SAME: i32,
// CHECK-SAME: i32,
// : [4 x i8],
// CHECK-SAME: i64
// CHECK-SAME: }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// UNSUPPORTED: CPU=armv7 && OS=ios
// UNSUPPORTED: CPU=armv7s && OS=ios

// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant { i64 } zeroinitializer, align [[ALIGNMENT]]
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ i64 }> zeroinitializer, align [[ALIGNMENT]]

// CHECK: @"$s4main4PairVMP" = internal constant <{
// : i32,
Expand Down Expand Up @@ -68,9 +68,9 @@
// : i32 trunc (
// CHECK-SAME: [[INT]] sub (
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: {
// CHECK-SAME: <{
// CHECK-SAME: i64
// CHECK-SAME: }* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: }>* [[EXTRA_DATA_PATTERN]] to [[INT]]
// CHECK-SAME: ),
// CHECK-SAME: [[INT]] ptrtoint (
// CHECK-SAME: i32* getelementptr inbounds (
Expand Down