Skip to content

Commit cc3ca1c

Browse files
committed
Update tests and verifier checks
1 parent ecafc6a commit cc3ca1c

File tree

7 files changed

+132
-56
lines changed

7 files changed

+132
-56
lines changed

lib/SIL/IR/Linker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void SILLinkerVisitor::maybeAddFunctionToWorklist(
102102
SILFunction *F, SerializedKind_t callerSerializedKind) {
103103
SILLinkage linkage = F->getLinkage();
104104
assert((callerSerializedKind == IsNotSerialized ||
105-
F->hasValidLinkageForFragileRef() ||
105+
F->hasValidLinkageForFragileRef(callerSerializedKind) ||
106106
hasSharedVisibility(linkage) || F->isExternForwardDeclaration()) &&
107107
"called function has wrong linkage for serialized function");
108108

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2451,7 +2451,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
24512451
// from a fragile function is an error.
24522452
if (!F.isNotSerialized()) {
24532453
require((SingleFunction && RefF->isExternalDeclaration()) ||
2454-
RefF->hasValidLinkageForFragileRef(F.getSerializedKind()),
2454+
RefF->hasValidLinkageForFragileRef(),
24552455
"function_ref inside fragile function cannot "
24562456
"reference a private or hidden symbol");
24572457
}

lib/SILOptimizer/IPO/CrossModuleOptimization.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,11 @@ bool CrossModuleOptimization::shouldSerialize(SILFunction *function) {
611611
/// marked in \p canSerializeFlags.
612612
void CrossModuleOptimization::serializeFunction(SILFunction *function,
613613
const FunctionFlags &canSerializeFlags) {
614+
// This means the function is @inlinable (or similar)
615+
// so should have [serialized] attribute.
616+
if (function->isSerialized())
617+
return;
618+
614619
if (isSerializedWithRightKind(M, function))
615620
return;
616621

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-build-swift %s \
4+
// RUN: -module-name=Lib -package-name Pkg \
5+
// RUN: -parse-as-library -emit-module -emit-module-path %t/Lib.swiftmodule -I%t \
6+
// RUN: -Xfrontend -experimental-package-cmo -Xfrontend -experimental-allow-non-resilient-access \
7+
// RUN: -O -wmo -enable-library-evolution
8+
9+
// RUN: %target-sil-opt %t/Lib.swiftmodule -sil-verify-all -o %t/Lib.sil
10+
// RUN: %FileCheck %s --check-prefix=CHECK < %t/Lib.sil
11+
12+
// REQUIRES: swift_in_compiler
13+
14+
public struct Something {
15+
public init() {}
16+
17+
public func f() -> Int {
18+
return 7
19+
}
20+
}
21+
22+
23+
@usableFromInline
24+
func use(_ c: () -> Int) { }
25+
26+
// Don't crash on this example
27+
@inlinable
28+
public func reproduce(_ e: Something) {
29+
use {
30+
return e.f()
31+
}
32+
}
33+
34+
// use(_:)
35+
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib3useyySiyXEF : $@convention(thin) (@guaranteed @noescape @callee_guaranteed () -> Int) -> () {
36+
// CHECK: bb0(%0 : $@noescape @callee_guaranteed () -> Int):
37+
// CHECK: [[RESULT:%.*]] = tuple ()
38+
// CHECK: return [[RESULT]] : $()
39+
// CHECK: } // end sil function '$s3Lib3useyySiyXEF'
40+
41+
// closure #1 in reproduce(_:)
42+
// CHECK: sil shared [serialized] [canonical] @$s3Lib9reproduceyyAA9SomethingVFSiyXEfU_ : $@convention(thin) (@in_guaranteed Something) -> Int {
43+
// function_ref Something.f()
44+
// CHECK: bb0(%0 : @closureCapture $*Something):
45+
// CHECK: [[REF:%.*]] = function_ref @$s3Lib9SomethingV1fSiyF : $@convention(method) (@in_guaranteed Something) -> Int
46+
// CHECK: [[VAL:%.*]] = apply [[REF]](%0) : $@convention(method) (@in_guaranteed Something) -> Int
47+
// CHECK: return [[VAL]] : $Int
48+
// CHECK: } // end sil function '$s3Lib9reproduceyyAA9SomethingVFSiyXEfU_'
49+
50+
// Something.f()
51+
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib9SomethingV1fSiyF : $@convention(method) (@in_guaranteed Something) -> Int {
52+
53+
// Something.init()
54+
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib9SomethingVACycfC : $@convention(method) (@thin Something.Type) -> @out Something {
55+
56+
// reproduce(_:)
57+
// CHECK: sil [serialized] [canonical] @$s3Lib9reproduceyyAA9SomethingVF : $@convention(thin) (@in_guaranteed Something) -> () {
58+
// CHECK: bb0(%0 : $*Something):
59+
// CHECK: [[CLOSURE_PTR:%.*]] = function_ref @$s3Lib9reproduceyyAA9SomethingVFSiyXEfU_ : $@convention(thin) (@in_guaranteed Something) -> Int
60+
// CHECK: [[CLOSURE_W_ARG:%.*]] = partial_apply [callee_guaranteed] [on_stack] [[CLOSURE_PTR]](%0) : $@convention(thin) (@in_guaranteed Something) -> Int
61+
// CHECK: [[MARKED:%.*]] = mark_dependence [nonescaping] [[CLOSURE_W_ARG]] : $@noescape @callee_guaranteed () -> Int on %0 : $*Something
62+
// CHECK: [[USE_REF:%.*]] = function_ref @$s3Lib3useyySiyXEF : $@convention(thin) (@guaranteed @noescape @callee_guaranteed () -> Int) -> ()
63+
// CHECK: [[RESULT:%.*]] = apply [[USE_REF]]([[MARKED]]) : $@convention(thin) (@guaranteed @noescape @callee_guaranteed () -> Int) -> ()
64+

test/SILOptimizer/package-cmo-resilient-mode-inlinable.swift renamed to test/SILOptimizer/package-cmo-inlinable.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,17 @@ package func usePkgStruct(_ arg: Int) -> PkgStruct {
8686
// CHECK: store {{.*}} to %0 : $*UfiPkgStruct
8787

8888
/// @inlinable package func inLibUfiPkg(_ arg: Int) -> UfiPkgStruct
89-
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib02inA6UfiPkgyAA0cD6StructVSiF : $@convention(thin) (Int) -> @out UfiPkgStruct {
89+
// CHECK: sil [serialized] [canonical] @$s3Lib02inA6UfiPkgyAA0cD6StructVSiF : $@convention(thin) (Int) -> @out UfiPkgStruct {
9090
// CHECK: function_ref @$s3Lib12UfiPkgStructVyACSicfC : $@convention(method) (Int, @thin UfiPkgStruct.Type) -> @out UfiPkgStruct
9191
// CHECK: function_ref @$s3Lib12UfiPkgStructV03ufiC0SivM : $@yield_once @convention(method) (@inout UfiPkgStruct) -> @yields @inout Int
9292

9393
/// @inlinable func inLibUfiHid(_ arg: Int) -> UfiHidStruct
94-
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib02inA6UfiHidyAA0cD6StructVSiF : $@convention(thin) (Int) -> @out UfiHidStruct {
94+
// CHECK: sil [serialized] [canonical] @$s3Lib02inA6UfiHidyAA0cD6StructVSiF : $@convention(thin) (Int) -> @out UfiHidStruct {
9595
// CHECK: function_ref @$s3Lib12UfiHidStructVyACSicfC : $@convention(method) (Int, @thin UfiHidStruct.Type) -> @out UfiHidStruct
9696
// CHECK: function_ref @$s3Lib12UfiHidStructV03ufiC0SivM : $@yield_once @convention(method) (@inout UfiHidStruct) -> @yields @inout Int
9797

9898
/// @inlinable public func inLibPub(_ arg: Int) -> PubStruct
99-
// CHECK: sil [serialized_for_package] [canonical] @$s3Lib02inA3PubyAA0C6StructVSiF : $@convention(thin) (Int) -> @out PubStruct {
99+
// CHECK: sil [serialized] [canonical] @$s3Lib02inA3PubyAA0C6StructVSiF : $@convention(thin) (Int) -> @out PubStruct {
100100
// CHECK: function_ref @$s3Lib9PubStructVyACSicfC : $@convention(method) (Int, @thin PubStruct.Type) -> @out PubStruct
101101
// CHECK: function_ref @$s3Lib9PubStructV3pubSivM : $@yield_once @convention(method) (@inout PubStruct) -> @yields @inout Int
102102

@@ -146,6 +146,8 @@ func libUfiHid(_ arg: Int) -> UfiHidStruct {
146146
}
147147

148148
public struct PubStruct {
149+
// PubStruct.pub.getter
150+
// sil [serialized_for_package] [canonical] @$s3Lib9PubStructV3pubSivg : $@convention(method) (@in_guaranteed PubStruct) -> Int {
149151
public var pub: Int
150152
public init(_ arg: Int) {
151153
pub = arg
@@ -156,6 +158,8 @@ public struct PubStruct {
156158
}
157159

158160
package struct PkgStruct {
161+
// PkgStruct.pkg.modify
162+
// sil package [serialized_for_package] [canonical] @$s3Lib9PkgStructV3pkgSivM : $@yield_once @convention(method) (@inout PkgStruct) -> @yields @inout Int {
159163
package var pkg: Int
160164
package init(_ arg: Int) {
161165
pkg = arg
@@ -167,6 +171,8 @@ package struct PkgStruct {
167171

168172
@usableFromInline
169173
package struct UfiPkgStruct {
174+
// UfiPkgStruct.ufiPkg.getter
175+
// sil [serialized_for_package] [canonical] @$s3Lib12UfiPkgStructV03ufiC0Sivg : $@convention(method) (@in_guaranteed UfiPkgStruct) -> Int {
170176
@usableFromInline
171177
package var ufiPkg: Int
172178
@usableFromInline
@@ -181,6 +187,8 @@ package struct UfiPkgStruct {
181187

182188
@usableFromInline
183189
struct UfiHidStruct {
190+
// UfiHidStruct.ufiHid.setter
191+
// sil [serialized_for_package] [canonical] @$s3Lib12UfiHidStructV03ufiC0Sivs : $@convention(method) (Int, @inout UfiHidStruct) -> () {
184192
@usableFromInline
185193
var ufiHid: Int
186194
@usableFromInline

test/SILOptimizer/package-cmo-non-resilient-mode.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ package func callStaticPkgClosurePointer(_ x: Int) -> Int {
2121
return Module.PkgModuleStruct.closurePointer(x)
2222
}
2323

24-
// CHECK-LABEL: sil_global public_external @$s6Module0A6StructV21publicFunctionPointeryS2icvpZ : $@callee_guaranteed (Int) -> Int
25-
// CHECK-LABEL: sil_global package_external @$s6Module03PkgA6StructV11funcPointeryS2icvpZ : $@callee_guaranteed (Int) -> Int
24+
// static ModuleStruct.publicFunctionPointer
25+
// CHECK-LABEL: sil_global public_external [serialized_for_package] @$s6Module0A6StructV21publicFunctionPointeryS2icvpZ : $@callee_guaranteed (Int) -> Int
26+
// static PkgModuleStruct.funcPointer
27+
// CHECK-LABEL: sil_global package_external [serialized_for_package] @$s6Module03PkgA6StructV11funcPointeryS2icvpZ : $@callee_guaranteed (Int) -> Int
2628

2729

2830
// CHECK-LABEL: sil @$s4Main25callPublicFunctionPointeryS2iF : $@convention(thin) (Int) -> Int {

0 commit comments

Comments
 (0)