77import Builtin
88
99struct S { var a, b, c: Builtin.NativeObject }
10+
11+ // Check the constant discriminators for all value witnesses.
12+
1013// CHECK: @"$s4test1SVwCP.ptrauth" = private constant {{.*}} i64 55882
1114// CHECK: @"$s4test1SVwxx.ptrauth" = private constant {{.*}} i64 1272
1215// CHECK: @"$s4test1SVwcp.ptrauth" = private constant {{.*}} i64 58298
@@ -16,15 +19,26 @@ struct S { var a, b, c: Builtin.NativeObject }
1619// CHECK: @"$s4test1SVwet.ptrauth" = private constant {{.*}} i64 24816
1720// CHECK: @"$s4test1SVwst.ptrauth" = private constant {{.*}} i64 41169
1821
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+
1927sil @test_destroy : $@convention(thin) <T> (@in T) -> () {
2028bb0(%0 : $*T):
2129 destroy_addr %0 : $*T
2230 %result = tuple ()
2331 return %result : $()
2432}
2533// 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
2842// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
2943// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
3044// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
@@ -38,8 +52,14 @@ bb0(%0 : $*T, %1 : $*T):
3852 return %result : $()
3953}
4054// 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
4363// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
4464// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
4565// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 58298)
@@ -53,8 +73,14 @@ bb0(%0 : $*T, %1 : $*T):
5373 return %result : $()
5474}
5575// 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
5884// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
5985// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
6086// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 18648)
@@ -68,8 +94,14 @@ bb0(%0 : $*T, %1 : $*T):
6894 return %result : $()
6995}
7096// 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
73105// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
74106// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
75107// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 34641)
@@ -83,8 +115,14 @@ bb0(%0 : $*T, %1 : $*T):
83115 return %result : $()
84116}
85117// 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
88126// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
89127// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
90128// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 61402)
@@ -100,8 +138,14 @@ bb0(%0 : $*T, %1 : $*T):
100138 return %result : $()
101139}
102140// 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
105149// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
106150// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
107151// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
0 commit comments