11// RUN: %swift-frontend %s -enable-import-ptrauth-field-function-pointers -emit-ir -target arm64e-apple-ios13.0 -I %S/Inputs/ -validate-tbd-against-ir=none 2>&1 | %FileCheck %s
2+
23// REQUIRES: CPU=arm64e
34// REQUIRES: OS=ios
45
@@ -16,7 +17,7 @@ import PointerAuth
1617// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64*
1718// CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
1819// CHECK: [[SIGNEDINT:%.*]] = ptrtoint i64* [[PTR]] to i64
19- // CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 2 , i64 88, i32 0, i64 0)
20+ // CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 1 , i64 88, i32 0, i64 0)
2021// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
2122// CHECK: [[TMPCAST1:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
2223// CHECK: store i64* [[AUTHPTR]], i64** [[TMPCAST1]], align 8
@@ -37,13 +38,66 @@ func test_field_fn_read() -> Int32 {
3738// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
3839// CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
3940// CHECK: [[CAST4:%.*]] = ptrtoint i64* [[LD]] to i64
40- // CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 2 , i64 88)
41+ // CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 1 , i64 88)
4142// CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to i64*
4243// CHECK: [[CAST6:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
4344// CHECK: store i64* [[CAST5]], i64** [[CAST6]], align 8
4445func test_field_fn_ptr_modify( ) {
4546 ptr_to_secure_struct!. pointee. secure_func_ptr = returnInt
4647}
4748
49+ // CHECK: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B8_fn_reads5Int32VyF"() #0 {
50+ // CHECK: [[LD:%.*]] = load i64, i64* bitcast (%struct.AddressDiscriminatedSecureStruct** @ptr_to_addr_discriminated_secure_struct to i64*), align 8
51+ // CHECK: 5: ; preds = %entry
52+ // CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to i8*
53+ // CHECK: br label %12
54+ // CHECK: 12:
55+ // CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi i8* [ [[CAST0]], %5 ]
56+ // CHECK: [[CAST1:%.*]] = bitcast i8* [[AddressDiscriminatedSecureStruct]] to %TSo32AddressDiscriminatedSecureStructV*
57+ // CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* %14, i32 0, i32 0
58+ // CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
59+ // CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
60+ // CHECK: [[ADDR:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
61+ // CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 88)
62+ // CHECK: [[CAST3:%.*]] = ptrtoint i64* [[PTR]] to i64
63+ // CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST3]], i32 1, i64 [[BLEND]], i32 0, i64 0)
64+ // CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
65+ // CHECK: [[TMPCAST1:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
66+ // CHECK: store i64* [[AUTHPTR]], i64** [[TMPCAST1]], align 8
67+ // CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
68+ // CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
69+ func test_addr_discriminated_field_fn_read( ) -> Int32 {
70+ let fn = ptr_to_addr_discriminated_secure_struct!. pointee. secure_func_ptr!
71+ return fn ( )
72+ }
73+
74+ // CHECK-LABEL: define hidden swiftcc void @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B14_fn_ptr_modifyyyF"() #0 {
75+ // CHECK: 11: ; preds = %4
76+ // CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi i8* [ %5, %4 ]
77+ // CHECK: [[CAST1:%.*]] = bitcast i8* [[AddressDiscriminatedSecureStruct]] to %TSo32AddressDiscriminatedSecureStructV*
78+ // CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
79+ // CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
80+ // CHECK: store i64 ptrtoint ({ i8*, i32, i64, i64 }* @returnInt.ptrauth to i64), i64* [[CAST2]], align 8
81+ // CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
82+ // CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
83+ // CHECK: [[CAST4:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
84+ // CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST4]], i64 88)
85+ // CHECK: [[CAST5:%.*]] = ptrtoint i64* [[LD]] to i64
86+ // CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST5]], i32 0, i64 0, i32 1, i64 [[BLEND]])
87+ // CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to i64*
88+ // CHECK: [[CAST6:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
89+ // CHECK: store i64* [[CAST5]], i64** [[CAST6]], align 8
90+ func test_addr_discriminated_field_fn_ptr_modify( ) {
91+ ptr_to_addr_discriminated_secure_struct!. pointee. secure_func_ptr = returnInt
92+ }
93+
94+ // TODO: Unimplemented non trivial pointer auth copy function
95+ // func test_addr_discriminated_copy() -> Int32 {
96+ // let struct_with_signed_val = ptr_to_addr_discriminated_secure_struct.pointee
97+ // return struct_with_signed_val.secure_func_ptr()
98+ // }
99+
48100print ( test_field_fn_read ( ) )
49- print ( test_field_fn_ptr_modify ( ) )
101+ test_field_fn_ptr_modify ( )
102+ print ( test_addr_discriminated_field_fn_read ( ) )
103+ test_addr_discriminated_field_fn_ptr_modify ( )
0 commit comments