@@ -15,11 +15,19 @@ import PointerAuth
15
15
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* %14, i32 0, i32 0
16
16
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64*
17
17
// CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
18
+ // CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
19
+ // CHECK: [[COND:%.*]] = icmp ne i64* %16, null
20
+ // CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
21
+ // CHECK: resign-nonnull: ; preds = %12
18
22
// CHECK: [[SIGNEDINT:%.*]] = ptrtoint i64* [[PTR]] to i64
19
23
// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 1, i64 88, i32 0, i64 0)
20
24
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
21
- // CHECK: [[TMPCAST1:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
22
- // CHECK: store i64* [[AUTHPTR]], i64** [[TMPCAST1]], align 8
25
+ // CHECK: store i64* [[AUTHPTR]], i64** [[CAST3]], align 8
26
+ // CHECK: br label %resign-cont
27
+ // CHECK: resign-null: ; preds = %12
28
+ // CHECK: store i64* [[PTR]], i64** [[CAST3]], align 8
29
+ // CHECK: br label %resign-cont
30
+ // CHECK: resign-cont: ; preds = %resign-null, %resign-nonnull
23
31
// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
24
32
// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
25
33
func test_field_fn_read( ) -> Int32 {
@@ -34,13 +42,16 @@ func test_field_fn_read() -> Int32 {
34
42
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* [[CAST1]], i32 0, i32 0
35
43
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
36
44
// CHECK: store i64 ptrtoint ({ i8*, i32, i64, i64 }* @returnInt.ptrauth to i64), i64* [[CAST2]], align 8
45
+ // CHECK: [[PTR:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
37
46
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
38
47
// CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
48
+ // CHECK: [[COND:%.*]] = icmp ne i64* [[LD]], null
49
+ // CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
50
+ // CHECK: resign-nonnull: ; preds = %11
39
51
// CHECK: [[CAST4:%.*]] = ptrtoint i64* [[LD]] to i64
40
52
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 1, i64 88)
41
53
// CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to i64*
42
- // CHECK: [[CAST6:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
43
- // CHECK: store i64* [[CAST5]], i64** [[CAST6]], align 8
54
+ // CHECK: store i64* [[CAST5]], i64** [[PTR]], align 8
44
55
func test_field_fn_ptr_modify( ) {
45
56
ptr_to_secure_struct!. pointee. secure_func_ptr = returnInt
46
57
}
@@ -56,13 +67,18 @@ func test_field_fn_ptr_modify() {
56
67
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
57
68
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
58
69
// CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
70
+ // CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
71
+ // CHECK: [[COND:%.*]] = icmp ne i64* [[PTR]], null
72
+ // CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
73
+ // CHECK: resign-nonnull: ; preds = %12
59
74
// CHECK: [[ADDR:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
60
75
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 88)
61
- // CHECK: [[CAST3 :%.*]] = ptrtoint i64* [[PTR]] to i64
62
- // CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST3 ]], i32 1, i64 [[BLEND]], i32 0, i64 0)
76
+ // CHECK: [[CAST4 :%.*]] = ptrtoint i64* [[PTR]] to i64
77
+ // CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4 ]], i32 1, i64 [[BLEND]], i32 0, i64 0)
63
78
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
64
- // CHECK: [[TMPCAST1:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
65
- // CHECK: store i64* [[AUTHPTR]], i64** [[TMPCAST1]], align 8
79
+ // CHECK: store i64* [[AUTHPTR]], i64** [[CAST3]], align 8
80
+ // CHECK: br label %resign-cont
81
+ // CHECK: resign-cont: ; preds = %resign-null, %resign-nonnull
66
82
// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
67
83
// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
68
84
func test_addr_discriminated_field_fn_read( ) -> Int32 {
@@ -82,15 +98,18 @@ func test_addr_discriminated_field_fn_read() -> Int32 {
82
98
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
83
99
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
84
100
// CHECK: store i64 ptrtoint ({ i8*, i32, i64, i64 }* @returnInt.ptrauth to i64), i64* [[CAST2]], align 8
101
+ // CHECK: [[PTR:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
85
102
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
86
103
// CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
104
+ // CHECK: [[COND:%.*]] = icmp ne i64* [[LD]], null
105
+ // CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
106
+ // CHECK: resign-nonnull: ; preds = %11
87
107
// CHECK: [[CAST4:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
88
108
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST4]], i64 88)
89
109
// CHECK: [[CAST5:%.*]] = ptrtoint i64* [[LD]] to i64
90
110
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST5]], i32 0, i64 0, i32 1, i64 [[BLEND]])
91
- // CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to i64*
92
- // CHECK: [[CAST6:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
93
- // CHECK: store i64* [[CAST5]], i64** [[CAST6]], align 8
111
+ // CHECK: [[CAST6:%.*]] = inttoptr i64 [[SIGN]] to i64*
112
+ // CHECK: store i64* [[CAST6]], i64** [[PTR]], align 8
94
113
func test_addr_discriminated_field_fn_ptr_modify( ) {
95
114
ptr_to_addr_discriminated_secure_struct!. pointee. secure_func_ptr = returnInt
96
115
}
0 commit comments