Skip to content

Commit 41b388d

Browse files
committed
Verify support for -enforce-exclusivity=checked.
Fix a verifier assert and add a test case for begin/end access markers.
1 parent ce9912a commit 41b388d

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

lib/SIL/SILVerifier.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
12631263
isa<ProjectBoxInst>(op) ||
12641264
isa<RefElementAddrInst>(op) ||
12651265
isa<SILFunctionArgument>(op) ||
1266-
isa<BeginAccessInst>(op),
1266+
isa<BeginAccessInst>(op) ||
1267+
isa<MarkUninitializedInst>(op),
12671268
"begin_access operand must be a root address derivation");
12681269

12691270
if (BAI->getModule().getStage() != SILStage::Raw) {

test/SILGen/access_marker_gen.swift

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// RUN: %target-swift-frontend -parse-as-library -Xllvm -sil-full-demangle -enforce-exclusivity=checked -emit-silgen %s | %FileCheck %s
2+
3+
public struct S {
4+
var i: Int
5+
var o: AnyObject?
6+
}
7+
8+
// CHECK-LABEL: sil hidden [noinline] @_T017access_marker_gen5initSAA1SVs9AnyObject_pSgF : $@convention(thin) (@owned Optional<AnyObject>) -> @owned S {
9+
// CHECK: bb0(%0 : $Optional<AnyObject>):
10+
// CHECK: %[[BOX:.*]] = alloc_box ${ var S }, var, name "s"
11+
// CHECK: %[[ADDRS:.*]] = project_box %[[BOX]] : ${ var S }, 0
12+
// CHECK: %[[UNINIT:.*]] = mark_uninitialized [var] %[[ADDRS]] : $*S
13+
// CHECK: cond_br %{{.*}}, bb1, bb2
14+
// CHECK: bb1:
15+
// CHECK: %[[ACCESS1:.*]] = begin_access [modify] [unknown] %[[UNINIT]] : $*S
16+
// CHECK: assign %{{.*}} to %[[ACCESS1]] : $*S
17+
// CHECK: end_access %[[ACCESS1]] : $*S
18+
// CHECK: bb2:
19+
// CHECK: %[[ACCESS2:.*]] = begin_access [modify] [unknown] %[[UNINIT]] : $*S
20+
// CHECK: assign %{{.*}} to %[[ACCESS2]] : $*S
21+
// CHECK: end_access %[[ACCESS2]] : $*S
22+
// CHECK: bb3:
23+
// CHECK: %[[ACCESS3:.*]] = begin_access [read] [unknown] %[[UNINIT]] : $*S
24+
// CHECK: %[[RET:.*]] = load [copy] %[[ACCESS3]] : $*S
25+
// CHECK: end_access %[[ACCESS3]] : $*S
26+
// CHECK: return %[[RET]] : $S
27+
// CHECK-LABEL: } // end sil function '_T017access_marker_gen5initSAA1SVs9AnyObject_pSgF'
28+
@inline(never)
29+
func initS(_ o: AnyObject?) -> S {
30+
var s: S
31+
if o == nil {
32+
s = S(i: 0, o: nil)
33+
} else {
34+
s = S(i: 1, o: o)
35+
}
36+
return s
37+
}
38+
39+
@inline(never)
40+
func takeS(_ s: S) {}
41+
42+
// CHECK-LABEL: sil @_T017access_marker_gen14modifyAndReadSyyF : $@convention(thin) () -> () {
43+
// CHECK: bb0:
44+
// CHECK: %[[BOX:.*]] = alloc_box ${ var S }, var, name "s"
45+
// CHECK: %[[ADDRS:.*]] = project_box %[[BOX]] : ${ var S }, 0
46+
// CHECK: %[[ACCESS1:.*]] = begin_access [modify] [unknown] %[[ADDRS]] : $*S
47+
// CHECK: %[[ADDRI:.*]] = struct_element_addr %15 : $*S, #S.i
48+
// CHECK: assign %{{.*}} to %[[ADDRI]] : $*Int
49+
// CHECK: end_access %[[ACCESS1]] : $*S
50+
// CHECK: %[[ACCESS2:.*]] = begin_access [read] [unknown] %[[ADDRS]] : $*S
51+
// CHECK: %{{.*}} = load [copy] %[[ACCESS2]] : $*S
52+
// CHECK: end_access %[[ACCESS2]] : $*S
53+
// CHECK-LABEL: } // end sil function '_T017access_marker_gen14modifyAndReadSyyF'
54+
public func modifyAndReadS() {
55+
var s = initS(nil)
56+
s.i = 42
57+
takeS(s)
58+
}

0 commit comments

Comments
 (0)