Skip to content

Commit 45967ce

Browse files
committed
[Exclusivity] Update tests for access markers.
1 parent 2336a87 commit 45967ce

File tree

5 files changed

+56
-25
lines changed

5 files changed

+56
-25
lines changed

test/Interpreter/enforce_exclusive_access.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: rm -rf %t
22
// RUN: mkdir -p %t
3-
// RUN: %target-build-swift %s -o %t/a.out -enforce-exclusivity=checked
3+
// RUN: %target-build-swift %s -o %t/a.out -enforce-exclusivity=checked -Onone
44
//
55
// RUN: %target-run %t/a.out
66
// REQUIRES: executable_test

test/SILGen/addressors.swift

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ struct A {
2929

3030
// CHECK-LABEL: sil hidden @_T010addressors1AV9subscripts5Int32VAFcfau : $@convention(method) (Int32, @inout A) -> UnsafeMutablePointer<Int32>
3131
// CHECK: bb0([[INDEX:%.*]] : $Int32, [[SELF:%.*]] : $*A):
32-
// CHECK: [[T0:%.*]] = struct_element_addr [[SELF]] : $*A, #A.base
32+
// CHECK: [[READ:%.*]] = begin_access [read] [static] [[SELF]] : $*A
33+
// CHECK: [[T0:%.*]] = struct_element_addr [[READ]] : $*A, #A.base
3334
// CHECK: [[BASE:%.*]] = load [[T0]] : $*UnsafeMutablePointer<Int32>
3435
// CHECK: return [[BASE]] : $UnsafeMutablePointer<Int32>
3536

@@ -49,17 +50,19 @@ func test0() {
4950
// CHECK: [[Z:%.*]] = load [[T3]] : $*Int32
5051
let z = a[10]
5152

53+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[A]] : $*A
5254
// CHECK: [[T0:%.*]] = function_ref @_T010addressors1AV9subscripts5Int32VAFcfau :
53-
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[A]])
55+
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
5456
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>, #UnsafeMutablePointer._rawValue
5557
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
5658
// CHECK: load
5759
// CHECK: sadd_with_overflow_Int{{32|64}}
5860
// CHECK: store {{%.*}} to [[T3]]
5961
a[5] += z
6062

63+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[A]] : $*A
6164
// CHECK: [[T0:%.*]] = function_ref @_T010addressors1AV9subscripts5Int32VAFcfau :
62-
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[A]])
65+
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
6366
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>, #UnsafeMutablePointer._rawValue
6467
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
6568
// CHECK: store {{%.*}} to [[T3]]
@@ -122,8 +125,9 @@ struct B : Subscriptable {
122125
// CHECK: [[T0:%.*]] = integer_literal $Builtin.Int32, 0
123126
// CHECK: [[INDEX:%.*]] = struct $Int32 ([[T0]] : $Builtin.Int32)
124127
// CHECK: [[RHS:%.*]] = integer_literal $Builtin.Int32, 7
128+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[B]] : $*B
125129
// CHECK: [[T0:%.*]] = function_ref @_T010addressors1BV9subscripts5Int32VAFcfau
126-
// CHECK: [[PTR:%.*]] = apply [[T0]]([[INDEX]], [[B]])
130+
// CHECK: [[PTR:%.*]] = apply [[T0]]([[INDEX]], [[WRITE]])
127131
// CHECK: [[T0:%.*]] = struct_extract [[PTR]] : $UnsafeMutablePointer<Int32>,
128132
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T0]] : $Builtin.RawPointer to [strict] $*Int32
129133
// Accept either of struct_extract+load or load+struct_element_addr.
@@ -149,14 +153,16 @@ func id_int(_ i: Int32) -> Int32 { return i }
149153
// CHECK-LABEL: sil hidden @_T010addressors11test_carrays5Int32VAA6CArrayVyA2DcGzF : $@convention(thin) (@inout CArray<(Int32) -> Int32>) -> Int32 {
150154
// CHECK: bb0([[ARRAY:%.*]] : $*CArray<(Int32) -> Int32>):
151155
func test_carray(_ array: inout CArray<(Int32) -> Int32>) -> Int32 {
156+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[ARRAY]] : $*CArray<(Int32) -> Int32>
152157
// CHECK: [[T0:%.*]] = function_ref @_T010addressors6CArrayV9subscriptxSicfau :
153-
// CHECK: [[T1:%.*]] = apply [[T0]]<(Int32) -> Int32>({{%.*}}, [[ARRAY]])
158+
// CHECK: [[T1:%.*]] = apply [[T0]]<(Int32) -> Int32>({{%.*}}, [[WRITE]])
154159
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<(Int32) -> Int32>, #UnsafeMutablePointer._rawValue
155160
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*@callee_owned (@in Int32) -> @out Int32
156161
// CHECK: store {{%.*}} to [[T3]] :
157162
array[0] = id_int
158163

159-
// CHECK: [[T0:%.*]] = load [[ARRAY]]
164+
// CHECK: [[READ:%.*]] = begin_access [read] [static] [[ARRAY]] : $*CArray<(Int32) -> Int32>
165+
// CHECK: [[T0:%.*]] = load [[READ]]
160166
// CHECK: [[T1:%.*]] = function_ref @_T010addressors6CArrayV9subscriptxSicflu :
161167
// CHECK: [[T2:%.*]] = apply [[T1]]<(Int32) -> Int32>({{%.*}}, [[T0]])
162168
// CHECK: [[T3:%.*]] = struct_extract [[T2]] : $UnsafePointer<(Int32) -> Int32>, #UnsafePointer._rawValue
@@ -205,22 +211,25 @@ func take_int_inout(_ value: inout Int32) {}
205211
func test_d(_ array: inout D) -> Int32 {
206212
// CHECK: [[T0:%.*]] = function_ref @_T010addressors8make_ints5Int32VyF
207213
// CHECK: [[V:%.*]] = apply [[T0]]()
214+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[ARRAY]] : $*D
208215
// CHECK: [[T0:%.*]] = function_ref @_T010addressors1DV9subscripts5Int32VAFcfau
209-
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[ARRAY]])
216+
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
210217
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>,
211218
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
212219
// CHECK: store [[V]] to [[ADDR]] : $*Int32
213220
array[0] = make_int()
214221

215222
// CHECK: [[FN:%.*]] = function_ref @_T010addressors14take_int_inoutys5Int32VzF
223+
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[ARRAY]] : $*D
216224
// CHECK: [[T0:%.*]] = function_ref @_T010addressors1DV9subscripts5Int32VAFcfau
217-
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[ARRAY]])
225+
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
218226
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>,
219227
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
220228
// CHECK: apply [[FN]]([[ADDR]])
221229
take_int_inout(&array[1])
222230

223-
// CHECK: [[T0:%.*]] = load [[ARRAY]]
231+
// CHECK: [[READ:%.*]] = begin_access [read] [static] [[ARRAY]] : $*D
232+
// CHECK: [[T0:%.*]] = load [[READ]]
224233
// CHECK: [[T1:%.*]] = function_ref @_T010addressors1DV9subscripts5Int32VAFcfg
225234
// CHECK: [[T2:%.*]] = apply [[T1]]({{%.*}}, [[T0]])
226235
// CHECK: return [[T2]]

test/SILGen/unmanaged.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ func set(holder holder: inout Holder) {
2020
// CHECK: bb0([[ADDR:%.*]] : $*Holder):
2121
// CHECK: [[T0:%.*]] = function_ref @_T09unmanaged1CC{{[_0-9a-zA-Z]*}}fC
2222
// CHECK: [[C:%.*]] = apply [[T0]](
23-
// CHECK-NEXT: [[T0:%.*]] = struct_element_addr [[ADDR]] : $*Holder, #Holder.value
23+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[ADDR]] : $*Holder
24+
// CHECK-NEXT: [[T0:%.*]] = struct_element_addr [[WRITE]] : $*Holder, #Holder.value
2425
// CHECK-NEXT: [[T1:%.*]] = ref_to_unmanaged [[C]]
2526
// CHECK-NEXT: store [[T1]] to [[T0]]
2627
// CHECK-NEXT: strong_release [[C]]
28+
// CHECK-NEXT: end_access [[WRITE]] : $*Holder
2729
// CHECK-NEXT: tuple ()
2830
// CHECK-NEXT: return
2931

@@ -33,10 +35,12 @@ func get(holder holder: inout Holder) -> C {
3335
// CHECK-LABEL:sil hidden @_T09unmanaged3getAA1CCAA6HolderVz6holder_tF : $@convention(thin) (@inout Holder) -> @owned C
3436
// CHECK: bb0([[ADDR:%.*]] : $*Holder):
3537
// CHECK-NEXT: debug_value_addr %0 : $*Holder, var, name "holder", argno 1
36-
// CHECK-NEXT: [[T0:%.*]] = struct_element_addr [[ADDR]] : $*Holder, #Holder.value
38+
// CHECK-NEXT: [[READ:%.*]] = begin_access [read] [static] [[ADDR]] : $*Holder
39+
// CHECK-NEXT: [[T0:%.*]] = struct_element_addr [[READ]] : $*Holder, #Holder.value
3740
// CHECK-NEXT: [[T1:%.*]] = load [[T0]] : $*@sil_unmanaged C
3841
// CHECK-NEXT: [[T2:%.*]] = unmanaged_to_ref [[T1]]
3942
// CHECK-NEXT: strong_retain [[T2]]
43+
// CHECK-NEXT: end_access [[READ]] : $*Holder
4044
// CHECK-NEXT: return [[T2]]
4145

4246
func project(fn fn: () -> Holder) -> C {

test/SILOptimizer/access_marker_mandatory.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend -parse-as-library -Xllvm -sil-full-demangle -emit-sil -enforce-exclusivity=checked %s | %FileCheck %s
1+
// RUN: %target-swift-frontend -parse-as-library -Xllvm -sil-full-demangle -emit-sil -Onone -enforce-exclusivity=checked %s | %FileCheck %s
22

33
public struct S {
44
var i: Int
@@ -66,17 +66,17 @@ public func modifyAndReadS(o: AnyObject) {
6666
// Otherwise, we may try to convert the access to [deinit] which
6767
// doesn't make sense dynamically.
6868
//
69-
// CHECK-LABEL: sil hidden @_T028access_enforcement_selection19captureStackPromoteSiycyF : $@convention(thin) () -> @owned @callee_owned () -> Int {
69+
// CHECK-LABEL: sil hidden @_T023access_marker_mandatory19captureStackPromoteSiycyF : $@convention(thin) () -> @owned @callee_owned () -> Int {
7070
// CHECK-LABEL: bb0:
7171
// CHECK: [[STK:%.*]] = alloc_stack $Int, var, name "x"
7272
// CHECK: [[WRITE:%.*]] = begin_access [modify] [static] [[STK]] : $*Int
7373
// CHECK: store %{{.*}} to [[WRITE]] : $*Int
7474
// CHECK: end_access [[WRITE]] : $*Int
75-
// CHECK: [[F:%.*]] = function_ref @_T028access_enforcement_selection19captureStackPromoteSiycyFSiycfU_Tf2i_n : $@convention(thin) (Int) -> Int
75+
// CHECK: [[F:%.*]] = function_ref @_T023access_marker_mandatory19captureStackPromoteSiycyFSiycfU_Tf2i_n : $@convention(thin) (Int) -> Int
7676
// CHECK: [[C:%.*]] = partial_apply [[F]](%{{.*}}) : $@convention(thin) (Int) -> Int
7777
// CHECK: dealloc_stack [[STK]] : $*Int
7878
// CHECK: return [[C]] : $@callee_owned () -> Int
79-
// CHECK-LABEL: } // end sil function '_T028access_enforcement_selection19captureStackPromoteSiycyF'
79+
// CHECK-LABEL: } // end sil function '_T023access_marker_mandatory19captureStackPromoteSiycyF'
8080
func captureStackPromote() -> () -> Int {
8181
var x = 1
8282
x = 2

test/SILOptimizer/definite_init_failable_initializers.swift

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ struct FailableStruct {
5353
// CHECK: bb0(%0 : $@thin FailableStruct.Type):
5454
// CHECK-NEXT: [[SELF_BOX:%.*]] = alloc_stack $FailableStruct
5555
// CHECK: [[CANARY:%.*]] = apply
56-
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
56+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableStruct
57+
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[WRITE]]
5758
// CHECK-NEXT: store [[CANARY]] to [[X_ADDR]]
59+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableStruct
5860
// CHECK-NEXT: br bb1
5961
// CHECK: bb1:
6062
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
@@ -73,11 +75,15 @@ struct FailableStruct {
7375
// CHECK: bb0
7476
// CHECK: [[SELF_BOX:%.*]] = alloc_stack $FailableStruct
7577
// CHECK: [[CANARY1:%.*]] = apply
76-
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
78+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableStruct
79+
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[WRITE]]
7780
// CHECK-NEXT: store [[CANARY1]] to [[X_ADDR]]
81+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableStruct
7882
// CHECK: [[CANARY2:%.*]] = apply
79-
// CHECK-NEXT: [[Y_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
83+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableStruct
84+
// CHECK-NEXT: [[Y_ADDR:%.*]] = struct_element_addr [[WRITE]]
8085
// CHECK-NEXT: store [[CANARY2]] to [[Y_ADDR]]
86+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableStruct
8187
// CHECK-NEXT: br bb1
8288
// CHECK: bb1:
8389
// CHECK-NEXT: [[SELF:%.*]] = struct $FailableStruct ([[CANARY1]] : $Canary, [[CANARY2]] : $Canary)
@@ -97,7 +103,9 @@ struct FailableStruct {
97103
// CHECK: bb0
98104
// CHECK: [[SELF_BOX:%.*]] = alloc_stack $FailableStruct
99105
// CHECK: [[CANARY]] = apply
100-
// CHECK-NEXT: store [[CANARY]] to [[SELF_BOX]]
106+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableStruct
107+
// CHECK-NEXT: store [[CANARY]] to [[WRITE]]
108+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableStruct
101109
// CHECK-NEXT: br bb1
102110
// CHECK: bb1:
103111
// CHECK-NEXT: release_value [[CANARY]]
@@ -221,8 +229,10 @@ struct FailableAddrOnlyStruct<T : Pachyderm> {
221229
// CHECK-NEXT: [[X_BOX:%.*]] = alloc_stack $T
222230
// CHECK-NEXT: [[T_TYPE:%.*]] = metatype $@thick T.Type
223231
// CHECK-NEXT: apply [[T_INIT_FN]]<T>([[X_BOX]], [[T_TYPE]])
224-
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
232+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableAddrOnlyStruct<T>
233+
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[WRITE]]
225234
// CHECK-NEXT: copy_addr [take] [[X_BOX]] to [initialization] [[X_ADDR]]
235+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableAddrOnlyStruct<T>
226236
// CHECK-NEXT: dealloc_stack [[X_BOX]]
227237
// CHECK-NEXT: br bb1
228238
// CHECK: bb1:
@@ -245,15 +255,19 @@ struct FailableAddrOnlyStruct<T : Pachyderm> {
245255
// CHECK-NEXT: [[X_BOX:%.*]] = alloc_stack $T
246256
// CHECK-NEXT: [[T_TYPE:%.*]] = metatype $@thick T.Type
247257
// CHECK-NEXT: apply [[T_INIT_FN]]<T>([[X_BOX]], [[T_TYPE]])
248-
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
258+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableAddrOnlyStruct<T>
259+
// CHECK-NEXT: [[X_ADDR:%.*]] = struct_element_addr [[WRITE]]
249260
// CHECK-NEXT: copy_addr [take] [[X_BOX]] to [initialization] [[X_ADDR]]
261+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableAddrOnlyStruct<T>
250262
// CHECK-NEXT: dealloc_stack [[X_BOX]]
251263
// CHECK-NEXT: [[T_INIT_FN:%.*]] = witness_method $T, #Pachyderm.init!allocator.1
252264
// CHECK-NEXT: [[Y_BOX:%.*]] = alloc_stack $T
253265
// CHECK-NEXT: [[T_TYPE:%.*]] = metatype $@thick T.Type
254266
// CHECK-NEXT: apply [[T_INIT_FN]]<T>([[Y_BOX]], [[T_TYPE]])
255-
// CHECK-NEXT: [[Y_ADDR:%.*]] = struct_element_addr [[SELF_BOX]]
267+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*FailableAddrOnlyStruct<T>
268+
// CHECK-NEXT: [[Y_ADDR:%.*]] = struct_element_addr [[WRITE]]
256269
// CHECK-NEXT: copy_addr [take] [[Y_BOX]] to [initialization] [[Y_ADDR]]
270+
// CHECK-NEXT: end_access [[WRITE]] : $*FailableAddrOnlyStruct<T>
257271
// CHECK-NEXT: dealloc_stack [[Y_BOX]]
258272
// CHECK-NEXT: br bb1
259273
// CHECK: bb1:
@@ -578,7 +592,9 @@ struct ThrowStruct {
578592
// CHECK-NEXT: [[SELF_TYPE:%.*]] = metatype $@thin ThrowStruct.Type
579593
// CHECK-NEXT: try_apply [[INIT_FN]]([[SELF_TYPE]])
580594
// CHECK: bb1([[NEW_SELF:%.*]] : $ThrowStruct):
581-
// CHECK-NEXT: store [[NEW_SELF]] to [[SELF_BOX]]
595+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*ThrowStruct
596+
// CHECK-NEXT: store [[NEW_SELF]] to [[WRITE]]
597+
// CHECK-NEXT: end_access [[WRITE]] : $*ThrowStruct
582598
// CHECK-NEXT: dealloc_stack [[SELF_BOX]]
583599
// CHECK-NEXT: return [[NEW_SELF]]
584600
// CHECK: bb2([[ERROR:%.*]] : $Error):
@@ -594,7 +610,9 @@ struct ThrowStruct {
594610
// CHECK: [[INIT_FN:%.*]] = function_ref @_T035definite_init_failable_initializers11ThrowStructVACyt6noFail_tcfC
595611
// CHECK-NEXT: [[SELF_TYPE:%.*]] = metatype $@thin ThrowStruct.Type
596612
// CHECK-NEXT: [[NEW_SELF:%.*]] = apply [[INIT_FN]]([[SELF_TYPE]])
597-
// CHECK-NEXT: store [[NEW_SELF]] to [[SELF_BOX]]
613+
// CHECK-NEXT: [[WRITE:%.*]] = begin_access [modify] [static] [[SELF_BOX]] : $*ThrowStruct
614+
// CHECK-NEXT: store [[NEW_SELF]] to [[WRITE]]
615+
// CHECK-NEXT: end_access [[WRITE]] : $*ThrowStruct
598616
// CHECK: [[UNWRAP_FN:%.*]] = function_ref @_T035definite_init_failable_initializers6unwrapS2iKF
599617
// CHECK-NEXT: try_apply [[UNWRAP_FN]](%0)
600618
// CHECK: bb1([[RESULT:%.*]] : $Int):

0 commit comments

Comments
 (0)