Skip to content

Commit d44247a

Browse files
committed
[metadata prespecialization] Specify linkage to be shared.
Prespecialized metadata may be requested in multiple modules and those definitions must be deduplicated when statically linking those modules together. Here, the SILLinkage for prespecialized metadata is specified to be Shared. Consequently, the IRLinkage's Linkage for this record is made to be LinkOnceODRLinkage. rdar://problem/56997414
1 parent 84ec27c commit d44247a

File tree

38 files changed

+61
-56
lines changed

38 files changed

+61
-56
lines changed

lib/IRGen/Linking.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,11 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
492492
if (getDeclLinkage(nominal) == FormalLinkage::PublicNonUnique)
493493
return SILLinkage::Shared;
494494

495+
// Prespecialization of the same generic metadata may be requested
496+
// multiple times within the same module, so it needs to be uniqued.
497+
if (nominal->isGenericContext())
498+
return SILLinkage::Shared;
499+
495500
// The full metadata object is private to the containing module.
496501
return SILLinkage::Private;
497502
case TypeMetadataAddress::AddressPoint: {

test/IRGen/prespecialized-metadata/enum-fileprivate-inmodule-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// UNSUPPORTED: CPU=armv7 && OS=ios
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

8-
// CHECK: @"$s4main5Value[[UNIQUE_ID_1:[0-9A-Z_]+]]OySiGMf" = internal constant <{
8+
// CHECK: @"$s4main5Value[[UNIQUE_ID_1:[0-9A-Z_]+]]OySiGMf" = linkonce_odr hidden constant <{
99
// CHECK-SAME: i8**,
1010
// CHECK-SAME: [[INT]],
1111
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-0argument-within-class-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// UNSUPPORTED: CPU=armv7 && OS=ios
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

8-
// CHECK: @"$s4main9NamespaceC5ValueOySi_GMf" = internal constant <{
8+
// CHECK: @"$s4main9NamespaceC5ValueOySi_GMf" = linkonce_odr hidden constant <{
99
// CHECk-SAME: i8**,
1010
// CHECK-SAME: [[INT]],
1111
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-1conformance-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
99

10-
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
10+
// CHECK: @"$s4main5ValueOySiGMf" = linkonce_odr hidden constant <{
1111
// CHECK-SAME: i8**,
1212
// CHECK-SAME: [[INT]],
1313
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-1conformance-public-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
99

10-
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
10+
// CHECK: @"$s4main5ValueOySiGMf" = linkonce_odr hidden constant <{
1111
// CHECK-SAME: i8**,
1212
// CHECK-SAME: [[INT]],
1313
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-1distinct_generic_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

88
// CHECK: @"$s4main5OuterOyAA5InnerVySiGGWV" = linkonce_odr hidden constant %swift.enum_vwtable
9-
// CHECK: @"$s4main5OuterOyAA5InnerVySiGGMf" = internal constant <{
9+
// CHECK: @"$s4main5OuterOyAA5InnerVySiGGMf" = linkonce_odr hidden constant <{
1010
// CHECK-SAME: i8**,
1111
// CHECK-SAME: [[INT]],
1212
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOySiGwup" to i8*),
2222
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOySiGwui" to i8*)
2323
// CHECK-SAME: }, align [[ALIGNMENT]]
24-
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
24+
// CHECK: @"$s4main5ValueOySiGMf" = linkonce_odr hidden constant <{
2525
// CHECK-SAME: i8**,
2626
// CHECK-SAME: [[INT]],
2727
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-within-class-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// UNSUPPORTED: CPU=armv7 && OS=ios
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

8-
// CHECK: @"$s4main9NamespaceC5ValueOySS_SiGMf" = internal constant <{
8+
// CHECK: @"$s4main9NamespaceC5ValueOySS_SiGMf" = linkonce_odr hidden constant <{
99
// CHECK-SAME: i8**,
1010
// CHECK-SAME: [[INT]],
1111
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-within-enum-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// UNSUPPORTED: CPU=armv7 && OS=ios
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

8-
// CHECK: @"$s4main9NamespaceO5ValueOySS_SiGMf" = internal constant <{
8+
// CHECK: @"$s4main9NamespaceO5ValueOySS_SiGMf" = linkonce_odr hidden constant <{
99
// CHECK-SAME: i8**,
1010
// CHECK-SAME: [[INT]],
1111
// CHECK-SAME: %swift.type_descriptor*,

test/IRGen/prespecialized-metadata/enum-inmodule-1argument-within-struct-1argument-1distinct_use.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// UNSUPPORTED: CPU=armv7 && OS=ios
66
// UNSUPPORTED: CPU=armv7s && OS=ios
77

8-
// CHECK: @"$s4main9NamespaceV5ValueOySS_SiGMf" = internal constant <{
8+
// CHECK: @"$s4main9NamespaceV5ValueOySS_SiGMf" = linkonce_odr hidden constant <{
99
// CHECK-SAME: i8**,
1010
// CHECK-SAME: [[INT]],
1111
// CHECK-SAME: %swift.type_descriptor*,

0 commit comments

Comments
 (0)