@@ -17,6 +17,22 @@ void test_auth() {
17
17
fnptr = __builtin_ptrauth_auth (fnptr , 0 , ptr_discriminator );
18
18
}
19
19
20
+ // CHECK-LABEL: define void @test_auth_ptrauth_qual(
21
+ void test_auth_ptrauth_qual (int * a ) {
22
+ // CHECK: alloca i32*, align 8
23
+ // CHECK: %[[VALUE:.*]] = alloca i32*, align 8
24
+
25
+ // CHECK: %[[V5:.*]] = phi i32* [ null, %{{.*}} ], [ {{.*}} ]
26
+ // CHECK: store i32* %[[V5]], i32** %[[VALUE]], align 8
27
+ // CHECK: %[[V6:.*]] = load i32*, i32** %[[VALUE]], align 8
28
+ // CHECK: %[[V7:.*]] = ptrtoint i32* %[[V6]] to i64
29
+ // CHECK: %[[V8:.*]] = call i64 @llvm.ptrauth.auth.i64(i64 %[[V7]], i32 1, i64 100)
30
+ // CHECK: %[[V9:.*]] = inttoptr i64 %[[V8]] to i32*
31
+ // CHECK: store i32* %[[V9]], i32** %{{.*}}, align 8
32
+ int * __ptrauth (1 , 0 , 100 ) value = a ;
33
+ int * p = __builtin_ptrauth_auth (value , 1 , 100 );
34
+ }
35
+
20
36
// CHECK-LABEL: define void @test_auth_peephole()
21
37
void test_auth_peephole () {
22
38
// CHECK: [[PTR:%.*]] = load void ()*, void ()** @fnptr,
@@ -37,6 +53,38 @@ void test_strip() {
37
53
fnptr = __builtin_ptrauth_strip (fnptr , 0 );
38
54
}
39
55
56
+ // CHECK-LABEL: define void @test_strip_ptrauth_qual0(
57
+ void test_strip_ptrauth_qual0 (int * a ) {
58
+ // CHECK: alloca i32*, align 8
59
+ // CHECK: %[[VALUE:.*]] = alloca i32*, align 8
60
+
61
+ // CHECK: %[[V5:.*]] = phi i32* [ null, %{{.*}} ], [ {{.*}} ]
62
+ // CHECK: store i32* %[[V5]], i32** %[[VALUE]], align 8
63
+ // CHECK: %[[V6:.*]] = load i32*, i32** %[[VALUE]], align 8
64
+ // CHECK: %[[V7:.*]] = ptrtoint i32* %[[V6]] to i64
65
+ // CHECK: %[[V8:.*]] = call i64 @llvm.ptrauth.strip.i64(i64 %[[V7]], i32 1)
66
+ // CHECK: %[[V9:.*]] = inttoptr i64 %[[V8]] to i32*
67
+ // CHECK: store i32* %[[V9]], i32** %{{.*}}, align 8
68
+ int * __ptrauth (1 , 0 , 100 ) value = a ;
69
+ int * p = __builtin_ptrauth_strip (value , 1 );
70
+ }
71
+
72
+ // CHECK-LABEL: define void @test_strip_ptrauth_qual1(
73
+ void test_strip_ptrauth_qual1 (int * a ) {
74
+ // CHECK: alloca i32*, align 8
75
+ // CHECK: %[[VALUE:.*]] = alloca i32*, align 8
76
+
77
+ // CHECK: %[[V5:.*]] = phi i32* [ null, %{{.*}} ], [ {{.*}} ]
78
+ // CHECK: store i32* %[[V5]], i32** %[[VALUE]], align 8
79
+ // CHECK: %[[V6:.*]] = load i32*, i32** %[[VALUE]], align 8
80
+ // CHECK: %[[V7:.*]] = ptrtoint i32* %[[V6]] to i64
81
+ // CHECK: %[[V8:.*]] = call i64 @llvm.ptrauth.strip.i64(i64 %[[V7]], i32 1)
82
+ // CHECK: %[[V9:.*]] = inttoptr i64 %[[V8]] to i32*
83
+ // CHECK: store i32* %[[V9]], i32** %{{.*}}, align 8
84
+ int * __ptrauth (1 , 0 , 100 ) value = a ;
85
+ int * p = __builtin_ptrauth_strip (* ((int * * )& value ), 1 );
86
+ }
87
+
40
88
// CHECK-LABEL: define void @test_sign_unauthenticated()
41
89
void test_sign_unauthenticated () {
42
90
// CHECK: [[PTR:%.*]] = load void ()*, void ()** @fnptr,
@@ -61,6 +109,22 @@ void test_auth_and_resign() {
61
109
fnptr = __builtin_ptrauth_auth_and_resign (fnptr , 0 , ptr_discriminator , 3 , 15 );
62
110
}
63
111
112
+ // CHECK-LABEL:define void @test_auth_and_resign_ptrauth_qual(
113
+ void test_auth_and_resign_ptrauth_qual (int * a ) {
114
+ // CHECK: alloca i32*, align 8
115
+ // CHECK: %[[VALUE:.*]] = alloca i32*, align 8
116
+
117
+ // CHECK: %[[V5:.*]] = phi i32* [ null, %{{.*}} ], [ {{.*}} ]
118
+ // CHECK: store i32* %[[V5]], i32** %[[VALUE]], align 8
119
+ // CHECK: %[[V6:.*]] = load i32*, i32** %[[VALUE]], align 8
120
+ // CHECK: %[[V7:.*]] = ptrtoint i32* %[[V6]] to i64
121
+ // CHECK: %[[V8:.*]] = call i64 @llvm.ptrauth.resign.i64(i64 %[[V7]], i32 1, i64 100, i32 1, i64 200)
122
+ // CHECK: %[[V9:.*]] = inttoptr i64 %[[V8]] to i32*
123
+ // CHECK: store i32* %[[V9]], i32** %{{.*}}, align 8
124
+ int * __ptrauth (1 , 0 , 100 ) value = a ;
125
+ int * p = __builtin_ptrauth_auth_and_resign (value , 1 , 100 , 1 , 200 );
126
+ }
127
+
64
128
// CHECK-LABEL: define void @test_blend_discriminator()
65
129
void test_blend_discriminator () {
66
130
// CHECK: [[PTR:%.*]] = load void ()*, void ()** @fnptr,
0 commit comments