annotate clang/test/CodeGenObjC/synchronized.m @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -emit-llvm -triple i686-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -o - %s -O2 | FileCheck %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 @interface MyClass
anatofuz
parents:
diff changeset
4 {
anatofuz
parents:
diff changeset
5 }
anatofuz
parents:
diff changeset
6 - (void)method;
anatofuz
parents:
diff changeset
7 @end
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 @implementation MyClass
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 // CHECK: define internal void @"\01-[MyClass method]"
anatofuz
parents:
diff changeset
12 - (void)method
anatofuz
parents:
diff changeset
13 {
anatofuz
parents:
diff changeset
14 // CHECK: call i32 @objc_sync_enter
anatofuz
parents:
diff changeset
15 // CHECK: call void @objc_exception_try_enter
anatofuz
parents:
diff changeset
16 // CHECK: call i32 @_setjmp
anatofuz
parents:
diff changeset
17 @synchronized(self) {
anatofuz
parents:
diff changeset
18 }
anatofuz
parents:
diff changeset
19 }
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 @end
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 // CHECK-LABEL: define void @foo(
anatofuz
parents:
diff changeset
24 void foo(id a) {
anatofuz
parents:
diff changeset
25 // CHECK: [[A:%.*]] = alloca i8*
anatofuz
parents:
diff changeset
26 // CHECK: [[SYNC:%.*]] = alloca i8*
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 // CHECK: store i8* [[AVAL:%.*]], i8** [[A]]
anatofuz
parents:
diff changeset
29 // CHECK-NEXT: call i32 @objc_sync_enter(i8* [[AVAL]])
anatofuz
parents:
diff changeset
30 // CHECK-NEXT: store i8* [[AVAL]], i8** [[SYNC]]
anatofuz
parents:
diff changeset
31 // CHECK-NEXT: call void @objc_exception_try_enter
anatofuz
parents:
diff changeset
32 // CHECK: call i32 @_setjmp
anatofuz
parents:
diff changeset
33 @synchronized(a) {
anatofuz
parents:
diff changeset
34 // This is unreachable, but the optimizers can't know that.
anatofuz
parents:
diff changeset
35 // CHECK: call void asm sideeffect "", "=*m,=*m,=*m"(i8** nonnull [[A]], i8** nonnull [[SYNC]]
anatofuz
parents:
diff changeset
36 // CHECK: call i32 @objc_sync_exit
anatofuz
parents:
diff changeset
37 // CHECK: call i8* @objc_exception_extract
anatofuz
parents:
diff changeset
38 // CHECK: call void @objc_exception_throw
anatofuz
parents:
diff changeset
39 // CHECK: unreachable
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 // CHECK: call void @objc_exception_try_exit
anatofuz
parents:
diff changeset
42 // CHECK: [[T:%.*]] = load i8*, i8** [[SYNC]]
anatofuz
parents:
diff changeset
43 // CHECK-NEXT: call i32 @objc_sync_exit
anatofuz
parents:
diff changeset
44 // CHECK: ret void
anatofuz
parents:
diff changeset
45 return;
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 }
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 // CHECK-LABEL: define i32 @f0(
anatofuz
parents:
diff changeset
51 int f0(id a) {
anatofuz
parents:
diff changeset
52 // TODO: we can optimize the ret to a constant if we can figure out
anatofuz
parents:
diff changeset
53 // either that x isn't stored to within the synchronized block or
anatofuz
parents:
diff changeset
54 // that the synchronized block can't longjmp.
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 // CHECK: [[X:%.*]] = alloca i32
anatofuz
parents:
diff changeset
57 // CHECK: store i32 1, i32* [[X]]
anatofuz
parents:
diff changeset
58 int x = 0;
anatofuz
parents:
diff changeset
59 @synchronized((x++, a)) {
anatofuz
parents:
diff changeset
60 }
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 // CHECK: [[T:%.*]] = load i32, i32* [[X]]
anatofuz
parents:
diff changeset
63 // CHECK: ret i32 [[T]]
anatofuz
parents:
diff changeset
64 return x;
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 // CHECK-LABEL: define void @f1(
anatofuz
parents:
diff changeset
68 void f1(id a) {
anatofuz
parents:
diff changeset
69 // Check that the return doesn't go through the cleanup.
anatofuz
parents:
diff changeset
70 extern void opaque(void);
anatofuz
parents:
diff changeset
71 opaque();
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 // CHECK: call void @opaque()
anatofuz
parents:
diff changeset
74 // CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 @synchronized(({ return; }), a) {
anatofuz
parents:
diff changeset
77 return;
anatofuz
parents:
diff changeset
78 }
anatofuz
parents:
diff changeset
79 }