7
7
import Builtin
8
8
9
9
struct S { var a, b, c: Builtin.NativeObject }
10
+
11
+ // Check the constant discriminators for all value witnesses.
12
+
10
13
// CHECK: @"$s4test1SVwCP.ptrauth" = private constant {{.*}} i64 55882
11
14
// CHECK: @"$s4test1SVwxx.ptrauth" = private constant {{.*}} i64 1272
12
15
// CHECK: @"$s4test1SVwcp.ptrauth" = private constant {{.*}} i64 58298
@@ -16,15 +19,26 @@ struct S { var a, b, c: Builtin.NativeObject }
16
19
// CHECK: @"$s4test1SVwet.ptrauth" = private constant {{.*}} i64 24816
17
20
// CHECK: @"$s4test1SVwst.ptrauth" = private constant {{.*}} i64 41169
18
21
22
+ // The pointer to the value witness table is signed too.
23
+
24
+ // 0x2e3f == 11839 is the constant discriminator for value witness tables.
25
+ // CHECK: @"$s4test1SVWV.ptrauth" = private constant {{.*}} i64 11839
26
+
19
27
sil @test_destroy : $@convention(thin) <T> (@in T) -> () {
20
28
bb0(%0 : $*T):
21
29
destroy_addr %0 : $*T
22
30
%result = tuple ()
23
31
return %result : $()
24
32
}
25
33
// CHECK-LABEL: define swiftcc void @test_destroy(
26
- // CHECK: [[VWT:%.*]] = load ptr,
27
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
34
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
35
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
36
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
37
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
38
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
39
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
40
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
41
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
28
42
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
29
43
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
30
44
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
@@ -38,8 +52,14 @@ bb0(%0 : $*T, %1 : $*T):
38
52
return %result : $()
39
53
}
40
54
// CHECK-LABEL: define swiftcc void @test_copy_init(
41
- // CHECK: [[VWT:%.*]] = load ptr,
42
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
55
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
56
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
57
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
58
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
59
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
60
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
61
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
62
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
43
63
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
44
64
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
45
65
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 58298)
@@ -53,8 +73,14 @@ bb0(%0 : $*T, %1 : $*T):
53
73
return %result : $()
54
74
}
55
75
// CHECK-LABEL: define swiftcc void @test_take_init(
56
- // CHECK: [[VWT:%.*]] = load ptr,
57
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
76
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
77
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
78
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
79
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
80
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
81
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
82
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
83
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
58
84
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
59
85
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
60
86
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 18648)
@@ -68,8 +94,14 @@ bb0(%0 : $*T, %1 : $*T):
68
94
return %result : $()
69
95
}
70
96
// CHECK-LABEL: define swiftcc void @test_copy_assign(
71
- // CHECK: [[VWT:%.*]] = load ptr,
72
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
97
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
98
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
99
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
100
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
101
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
102
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
103
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
104
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
73
105
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
74
106
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
75
107
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 34641)
@@ -83,8 +115,14 @@ bb0(%0 : $*T, %1 : $*T):
83
115
return %result : $()
84
116
}
85
117
// CHECK-LABEL: define swiftcc void @test_take_assign(
86
- // CHECK: [[VWT:%.*]] = load ptr,
87
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
118
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
119
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
120
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
121
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
122
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
123
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
124
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
125
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
88
126
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
89
127
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
90
128
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 61402)
@@ -100,8 +138,14 @@ bb0(%0 : $*T, %1 : $*T):
100
138
return %result : $()
101
139
}
102
140
// CHECK-LABEL: define swiftcc void @test_destroy_twice(
103
- // CHECK: [[VWT:%.*]] = load ptr,
104
- // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
141
+ // CHECK: [[SIGNED_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr {{%.*}}, i64 -1
142
+ // CHECK: [[SIGNED_VWT:%.*]] = load ptr, ptr [[SIGNED_VWT_ADDR]]
143
+ // CHECK: [[SIGNED_VWT_ADDR_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT_ADDR]]
144
+ // CHECK: [[BLENDED_ADDR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[SIGNED_VWT_ADDR_INT]], i64 11839)
145
+ // CHECK: [[SIGNED_VWT_INT:%.*]] = ptrtoint ptr [[SIGNED_VWT]]
146
+ // CHECK: [[AUTHENTICATED_VWT_INT:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[SIGNED_VWT_INT]], i32 2, i64 [[BLENDED_ADDR]])
147
+ // CHECK: [[AUTHENTICATED_VWT:%.*]] = inttoptr i64 [[AUTHENTICATED_VWT_INT]]
148
+ // CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[AUTHENTICATED_VWT]], i32
105
149
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
106
150
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
107
151
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
0 commit comments