Skip to content

Commit e383631

Browse files
authored
Merge pull request #70527 from tshortli/stolen-package
SIL: Allow package decls to be serialized when appropriate
2 parents a6c9887 + b4e1c48 commit e383631

6 files changed

+80
-18
lines changed

lib/SIL/IR/SILDeclRef.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,7 @@ IsSerialized_t SILDeclRef::isSerialized() const {
844844
}
845845

846846
// Anything else that is not public is not serializable.
847-
if (d->getEffectiveAccess() < AccessLevel::Public || d->hasPackageAccess())
847+
if (d->getEffectiveAccess() < AccessLevel::Public)
848848
return IsNotSerialized;
849849

850850
// Enum element constructors are serializable if the enum is
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package class Base {
2+
package func packageMethod() {}
3+
internal func internalMethod() {}
4+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-swift-frontend -emit-silgen %S/Inputs/accessibility_vtables_package_helper.swift -package-name Package | %FileCheck %s --check-prefix=LIBRARY
4+
// RUN: %target-swift-frontend -enable-library-evolution -emit-silgen %S/Inputs/accessibility_vtables_package_helper.swift -package-name Package | %FileCheck %s --check-prefix=LIBRARY
5+
6+
// RUN: %target-swift-frontend -emit-module -o %t %S/Inputs/accessibility_vtables_package_helper.swift -package-name Package
7+
// RUN: %target-swift-emit-silgen -primary-file %s -I %t -package-name Package | %FileCheck %s --check-prefix=CLIENT
8+
9+
// RUN: %target-swift-frontend -enable-library-evolution -emit-module -o %t %S/Inputs/accessibility_vtables_package_helper.swift -package-name Package
10+
// RUN: %target-swift-emit-silgen -primary-file %s -I %t -package-name Package | %FileCheck %s --check-prefix=CLIENT
11+
12+
import accessibility_vtables_package_helper
13+
14+
// LIBRARY-LABEL: sil_vtable Base {
15+
// LIBRARY-NEXT: #Base.packageMethod: (Base) -> () -> () : @$s36accessibility_vtables_package_helper4BaseC0C6MethodyyF
16+
// LIBRARY-NEXT: #Base.internalMethod: (Base) -> () -> () : @$s36accessibility_vtables_package_helper4BaseC14internalMethodyyF
17+
// LIBRARY-NEXT: #Base.init!allocator: (Base.Type) -> () -> Base : @$s36accessibility_vtables_package_helper4BaseCACycfC
18+
// LIBRARY-NEXT: #Base.deinit!deallocator: @$s36accessibility_vtables_package_helper4BaseCfD
19+
// LIBRARY-NEXT: }
20+
21+
// CLIENT-LABEL: sil hidden [ossa] @$s29accessibility_vtables_package15usePackageClassyy0a1_b1_C7_helper4BaseCF : $@convention(thin) (@guaranteed Base) -> () {
22+
func usePackageClass(_ c: Base) {
23+
c.packageMethod()
24+
}
25+
26+
// TODO: If cross-module inheritance from package visibility superclasses ever becomes a thing,
27+
// test serialization of the vtable for the derived class in this file.

test/SILGen/always_emit_into_client_attribute.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-emit-silgen -primary-file %s %S/Inputs/always_emit_into_client_other_file.swift | %FileCheck %s
1+
// RUN: %target-swift-emit-silgen -primary-file %s %S/Inputs/always_emit_into_client_other_file.swift -package-name Package | %FileCheck %s
22

33
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$s33always_emit_into_client_attribute0A22EmitIntoClientFunctionyyF : $@convention(thin) () -> ()
44
@_alwaysEmitIntoClient public func alwaysEmitIntoClientFunction() {
@@ -12,6 +12,17 @@
1212
alwaysEmitIntoClientOtherFunction()
1313
}
1414

15+
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$s33always_emit_into_client_attribute35packageAlwaysEmitIntoClientFunctionyyF : $@convention(thin) () -> ()
16+
@_alwaysEmitIntoClient package func packageAlwaysEmitIntoClientFunction() {
17+
alwaysEmitIntoClientOtherFunction()
18+
}
19+
20+
// FIXME: @_alwaysEmitIntoClient should not be allowed on private decls
21+
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$s33always_emit_into_client_attribute35privateAlwaysEmitIntoClientFunction33_5D0713A780245A446371C699E6F23C4FLLyyF : $@convention(thin) () -> ()
22+
@_alwaysEmitIntoClient private func privateAlwaysEmitIntoClientFunction() {
23+
alwaysEmitIntoClientOtherFunction()
24+
}
25+
1526
public struct S {
1627
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$s33always_emit_into_client_attribute1SV8propertySivg : $@convention(method) (S) -> Int
1728
// CHECK-LABEL: sil non_abi [serialized] [ossa] @$s33always_emit_into_client_attribute1SV8propertySivs : $@convention(method) (Int, @inout S) -> ()
Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,52 @@
11
// This file is also used by witness_tables_serialized_import.swift.
22

3-
// RUN: %target-swift-emit-silgen %s | %FileCheck -check-prefix CHECK -check-prefix CHECK-NONRESILIENT %s
4-
// RUN: %target-swift-emit-silgen -enable-library-evolution %s | %FileCheck -check-prefix CHECK -check-prefix CHECK-RESILIENT %s
3+
// RUN: %target-swift-emit-silgen %s -package-name Package | %FileCheck -check-prefix CHECK -check-prefix CHECK-NONRESILIENT %s
4+
// RUN: %target-swift-emit-silgen -enable-library-evolution %s -package-name Package | %FileCheck -check-prefix CHECK -check-prefix CHECK-RESILIENT %s
55

66
public protocol PublicProtocol {}
77

8-
@usableFromInline
8+
package protocol PackageProtocol {}
9+
10+
@usableFromInline internal protocol UsableFromInlineProtocol {}
11+
912
internal protocol InternalProtocol {}
1013

11-
@_fixed_layout
12-
public struct PublicStruct : PublicProtocol, InternalProtocol {}
14+
@frozen
15+
public struct PublicFrozenStruct : PublicProtocol, UsableFromInlineProtocol, PackageProtocol, InternalProtocol {}
1316

14-
public struct PublicResilientStruct : PublicProtocol, InternalProtocol {}
17+
public struct PublicResilientStruct : PublicProtocol, UsableFromInlineProtocol, PackageProtocol, InternalProtocol {}
18+
19+
package struct PackageStruct : PublicProtocol, UsableFromInlineProtocol, PackageProtocol, InternalProtocol {}
1520

1621
@usableFromInline
17-
internal struct InternalStruct : PublicProtocol, InternalProtocol {}
22+
internal struct UsableFromInlineStruct : PublicProtocol, UsableFromInlineProtocol, PackageProtocol, InternalProtocol {}
23+
24+
// CHECK-DAG: sil_witness_table [serialized] PublicFrozenStruct: PublicProtocol
25+
// CHECK-DAG: sil_witness_table [serialized] PublicFrozenStruct: UsableFromInlineProtocol
26+
// CHECK-DAG: sil_witness_table PublicFrozenStruct: PackageProtocol
27+
// CHECK-DAG: sil_witness_table hidden PublicFrozenStruct: InternalProtocol
1828

19-
// CHECK-DAG: sil_witness_table [serialized] PublicStruct: PublicProtocol
20-
// CHECK-DAG: sil_witness_table [serialized] PublicStruct: InternalProtocol
29+
// CHECK-DAG: sil_witness_table [serialized] PackageStruct: PublicProtocol
30+
// CHECK-DAG: sil_witness_table [serialized] PackageStruct: UsableFromInlineProtocol
31+
// CHECK-DAG: sil_witness_table PackageStruct: PackageProtocol
32+
// CHECK-DAG: sil_witness_table hidden PackageStruct: InternalProtocol
2133

22-
// CHECK-RESILIENT-DAG: sil_witness_table InternalStruct: InternalProtocol
23-
// CHECK-RESILIENT-DAG: sil_witness_table InternalStruct: PublicProtocol
34+
// CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: UsableFromInlineProtocol
35+
// CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PublicProtocol
36+
// CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PackageProtocol
37+
// CHECK-RESILIENT-DAG: sil_witness_table hidden UsableFromInlineStruct: InternalProtocol
2438

2539
// CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: PublicProtocol
26-
// CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: InternalProtocol
40+
// CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: UsableFromInlineProtocol
41+
// CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: PackageProtocol
42+
// CHECK-RESILIENT-DAG: sil_witness_table hidden PublicResilientStruct: InternalProtocol
2743

28-
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] InternalStruct: InternalProtocol
29-
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] InternalStruct: PublicProtocol
44+
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] UsableFromInlineStruct: UsableFromInlineProtocol
45+
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] UsableFromInlineStruct: PublicProtocol
46+
// CHECK-NONRESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PackageProtocol
47+
// CHECK-NONRESILIENT-DAG: sil_witness_table hidden UsableFromInlineStruct: InternalProtocol
3048

3149
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] PublicResilientStruct: PublicProtocol
32-
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] PublicResilientStruct: InternalProtocol
50+
// CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] PublicResilientStruct: UsableFromInlineProtocol
51+
// CHECK-NONRESILIENT-DAG: sil_witness_table PublicResilientStruct: PackageProtocol
52+
// CHECK-NONRESILIENT-DAG: sil_witness_table hidden PublicResilientStruct: InternalProtocol

test/SILGen/witness_tables_serialized_import.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend -emit-module %S/witness_tables_serialized.swift -o %t -enable-library-evolution
2+
// RUN: %target-swift-frontend -emit-module %S/witness_tables_serialized.swift -o %t -enable-library-evolution -package-name Package
33
// RUN: %target-swift-emit-silgen -I %t %s | %FileCheck %s
44

55
import witness_tables_serialized

0 commit comments

Comments
 (0)