@@ -15,11 +15,19 @@ import PointerAuth
1515// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* %14, i32 0, i32 0
1616// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64*
1717// 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
1822// CHECK: [[SIGNEDINT:%.*]] = ptrtoint i64* [[PTR]] to i64
1923// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 1, i64 88, i32 0, i64 0)
2024// 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
2331// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
2432// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
2533func test_field_fn_read( ) -> Int32 {
@@ -34,13 +42,16 @@ func test_field_fn_read() -> Int32 {
3442// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* [[CAST1]], i32 0, i32 0
3543// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
3644// 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**
3746// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
3847// 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
3951// CHECK: [[CAST4:%.*]] = ptrtoint i64* [[LD]] to i64
4052// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 1, i64 88)
4153// 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
4455func test_field_fn_ptr_modify( ) {
4556 ptr_to_secure_struct!. pointee. secure_func_ptr = returnInt
4657}
@@ -56,13 +67,18 @@ func test_field_fn_ptr_modify() {
5667// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
5768// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
5869// 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
5974// CHECK: [[ADDR:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
6075// 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)
6378// 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
6682// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
6783// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
6884func test_addr_discriminated_field_fn_read( ) -> Int32 {
@@ -82,15 +98,18 @@ func test_addr_discriminated_field_fn_read() -> Int32 {
8298// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
8399// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
84100// 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**
85102// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
86103// 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
87107// CHECK: [[CAST4:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
88108// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST4]], i64 88)
89109// CHECK: [[CAST5:%.*]] = ptrtoint i64* [[LD]] to i64
90110// 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
94113func test_addr_discriminated_field_fn_ptr_modify( ) {
95114 ptr_to_addr_discriminated_secure_struct!. pointee. secure_func_ptr = returnInt
96115}
0 commit comments