File: package-cmo-deserialize-for-external-client.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (137 lines) | stat: -rw-r--r-- 7,812 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// RUN: %empty-directory(%t)
// RUN: split-file %s %t

// RUN: %target-swift-frontend -emit-module %t/Lib.swift -I %t \
// RUN:   -module-name Lib -package-name pkg \
// RUN:   -enable-library-evolution -swift-version 5 \
// RUN:   -O -wmo -experimental-allow-non-resilient-access -experimental-package-cmo \
// RUN:   -emit-module -emit-module-path %t/Lib.swiftmodule
// RUN: %target-sil-opt %t/Lib.swiftmodule -o %t/Lib.sil

// RUN: %target-swift-frontend -emit-sil -O %t/Client.swift -I %t -package-name pkg \
// RUN: -Xllvm -sil-disable-pass=DeadFunctionAndGlobalElimination -o %t/InPkgClient.sil

// RUN: %target-swift-frontend -emit-sil -O %t/Client.swift -I %t \
// RUN: -Xllvm -sil-disable-pass=DeadFunctionAndGlobalElimination -o %t/ExtClient.sil

/// TEST how functions (and bodies) and tables optimized with [serialized_for_package] in Lib are
/// deserialized into Client depending on package boundary.
///
/// Test 1: They should be deserialized into Client as Lib and Client are in the same package.
// RUN: %FileCheck -check-prefix=CHECK-INPKG %s < %t/InPkgClient.sil

// Pub.__allocating_init(_:)
// CHECK-INPKG: sil public_external @$s3Lib3PubCyACSicfC : $@convention(method) (Int, @thick Pub.Type) -> @owned Pub {
// CHECK-INPKG:     function_ref @$s3Lib3PubCyACSicfc

// Pub.init(_:)
// CHECK-INPKG: sil @$s3Lib3PubCyACSicfc : $@convention(method) (Int, @owned Pub) -> @owned Pub

// CHECK-INPKG: sil_vtable Pub {
// CHECK-INPKG: #Pub.pubVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pubVarSivg  // Pub.pubVar.getter
// CHECK-INPKG: #Pub.pubVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pubVarSivs  // Pub.pubVar.setter
// CHECK-INPKG: #Pub.pubVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pubVarSivM  // Pub.pubVar.modify
// CHECK-INPKG: #Pub.pkgVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pkgVarSivg  // Pub.pkgVar.getter
// CHECK-INPKG: #Pub.pkgVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pkgVarSivs  // Pub.pkgVar.setter
// CHECK-INPKG: #Pub.pkgVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pkgVarSivM  // Pub.pkgVar.modify
// CHECK-INPKG: #Pub.init!allocator: (Pub.Type) -> (Int) -> Pub : @$s3Lib3PubCyACSicfC  // Pub.__allocating_init(_:)
// CHECK-INPKG: #Pub.deinit!deallocator: @$s3Lib3PubCfD  // Pub.__deallocating_deinit

// CHECK-INPKG: sil_witness_table public_external Pub: PubProto module Lib {
// CHECK-INPKG:  method #PubProto.pubVar!getter: <Self where Self : PubProto> (Self) -> () -> Int : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivgTW  // protocol witness for PubProto.pubVar.getter in conformance Pub
// CHECK-INPKG:  method #PubProto.pubVar!setter: <Self where Self : PubProto> (inout Self) -> (Int) -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivsTW  // protocol witness for PubProto.pubVar.setter in conformance Pub
// CHECK-INPKG:  method #PubProto.pubVar!modify: <Self where Self : PubProto> (inout Self) -> () -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivMTW  // protocol witness for PubProto.pubVar.modify in conformance Pub


/// Test 2: They should NOT be deserialized into Client as Lib and Client are NOT in the same package;
/// only declaration should be deserialized, not the body.
// RUN: %FileCheck -check-prefix=CHECK-EXT %s < %t/ExtClient.sil

// CHECK-EXT-NOT: sil_vtable Pub {
// CHECK-EXT-NOT: #Pub.pubVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pubVarSivg  // Pub.pubVar.getter
// CHECK-EXT-NOT: #Pub.pubVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pubVarSivs  // Pub.pubVar.setter
// CHECK-EXT-NOT: #Pub.pubVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pubVarSivM  // Pub.pubVar.modify
// CHECK-EXT-NOT: #Pub.pkgVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pkgVarSivg  // Pub.pkgVar.getter
// CHECK-EXT-NOT: #Pub.pkgVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pkgVarSivs  // Pub.pkgVar.setter
// CHECK-EXT-NOT: #Pub.pkgVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pkgVarSivM  // Pub.pkgVar.modify
// CHECK-EXT-NOT: #Pub.init!allocator: (Pub.Type) -> (Int) -> Pub : @$s3Lib3PubCyACSicfC  // Pub.__allocating_init(_:)
// CHECK-EXT-NOT: #Pub.deinit!deallocator: @$s3Lib3PubCfD  // Pub.__deallocating_deinit

// CHECK-EXT-NOT: sil_witness_table public_external Pub: PubProto module Lib {
// CHECK-EXT-NOT:  method #PubProto.pubVar!getter: <Self where Self : PubProto> (Self) -> () -> Int : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivgTW  // protocol witness for PubProto.pubVar.getter in conformance Pub
// CHECK-EXT-NOT:  method #PubProto.pubVar!setter: <Self where Self : PubProto> (inout Self) -> (Int) -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivsTW  // protocol witness for PubProto.pubVar.setter in conformance Pub
// CHECK-EXT-NOT:  method #PubProto.pubVar!modify: <Self where Self : PubProto> (inout Self) -> () -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivMTW  // protocol witness for PubProto.pubVar.modify in conformance Pub

// Pub.init(_:) is just a decl; does not contain the body.
// CHECK-EXT: sil @$s3Lib3PubCyACSicfc : $@convention(method) (Int, @owned Pub) -> @owned Pub


/// Verify functions and tables are optimized with Package CMO in Lib.
// RUN: %FileCheck -check-prefix=CHECK-LIB %s < %t/Lib.sil

// CHECK-LIB: sil [serialized] [exact_self_class] [canonical] @$s3Lib3PubCyACSicfC : $@convention(method) (Int, @thick Pub.Type) -> @owned Pub {
// CHECK-LIB:  function_ref @$s3Lib3PubCyACSicfc : $@convention(method) (Int, @owned Pub) -> @owned Pub

// Pub.pkgVar.getter
// CHECK-LIB: sil package [serialized_for_package] [canonical] @$s3Lib3PubC6pkgVarSivg : $@convention(method) (@guaranteed Pub) -> Int {

// CHECK-LIB: sil_vtable [serialized_for_package] Pub {
// CHECK-LIB:    #Pub.pubVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pubVarSivg  // Pub.pubVar.getter
// CHECK-LIB:    #Pub.pubVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pubVarSivs  // Pub.pubVar.setter
// CHECK-LIB:    #Pub.pubVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pubVarSivM  // Pub.pubVar.modify
// CHECK-LIB:    #Pub.pkgVar!getter: (Pub) -> () -> Int : @$s3Lib3PubC6pkgVarSivg  // Pub.pkgVar.getter
// CHECK-LIB:    #Pub.pkgVar!setter: (Pub) -> (Int) -> () : @$s3Lib3PubC6pkgVarSivs  // Pub.pkgVar.setter
// CHECK-LIB:    #Pub.pkgVar!modify: (Pub) -> () -> () : @$s3Lib3PubC6pkgVarSivM  // Pub.pkgVar.modify
// CHECK-LIB:    #Pub.init!allocator: (Pub.Type) -> (Int) -> Pub : @$s3Lib3PubCyACSicfC  // Pub.__allocating_init(_:)
// CHECK-LIB:    #Pub.deinit!deallocator: @$s3Lib3PubCfD  // Pub.__deallocating_deinit

// CHECK-LIB: sil_witness_table [serialized_for_package] Pub: PubProto module Lib {
// CHECK-LIB:    method #PubProto.pubVar!getter: <Self where Self : PubProto> (Self) -> () -> Int : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivgTW  // protocol witness for PubProto.pubVar.getter in conformance Pub
// CHECK-LIB:    method #PubProto.pubVar!setter: <Self where Self : PubProto> (inout Self) -> (Int) -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivsTW  // protocol witness for PubProto.pubVar.setter in conformance Pub
// CHECK-LIB:    method #PubProto.pubVar!modify: <Self where Self : PubProto> (inout Self) -> () -> () : @$s3Lib3PubCAA0B5ProtoA2aDP6pubVarSivMTW  // protocol witness for PubProto.pubVar.modify in conformance Pub


//--- Lib.swift

public protocol PubProto {
  var pubVar: Int { get set }
}

public class Pub: PubProto {
  public var pubVar: Int = 1
  package var pkgVar: Int = 2
  var internalVar: Int = 3
  public init(_ arg: Int) {
    pubVar = arg
    pkgVar = arg
  }
  public func pubFunc(_ arg: Pub) {
    print(arg.pubVar)
  }
}

public class SubPub: Pub {
  override public func pubFunc(_ arg: Pub) {
    print(arg.pubVar, arg.internalVar)
  }
}

//--- Client.swift
import Lib

public func test1(_ arg: Int) -> Int {
  let x = Pub(arg)
  x.pubVar = 3
  return x.run()
}

public func test2(_ arg: Int) {
  SubPub(arg).pubFunc(Pub(arg))
}

public extension PubProto {
  func run() -> Int {
    return pubVar
  }
}