1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
// 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 -Xllvm -sil-disable-pass=OnoneSimplification | %FileCheck %s
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import PointerAuth
// CHECK: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import05test_B8_fn_reads5Int32VyF"() #0 {
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_secure_struct, align 8
// CHECK: 2: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %9
// CHECK: 9:
// CHECK: [[SECURESTRUCT:%.*]] = phi ptr [ [[CAST0]], {{.*}} ]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, ptr [[SECURESTRUCT]], i32 0, i32 0
// CHECK: [[PTR:%.*]] = load ptr, ptr %.secure_func_ptr, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[PTR]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull:
// CHECK: [[SIGNEDINT:%.*]] = ptrtoint ptr [[PTR]] to i64
// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 1, i64 88, i32 0, i64 0)
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to ptr
// CHECK: store ptr [[AUTHPTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-null:
// CHECK: store ptr [[PTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-cont: ; preds = %resign-null, %resign-nonnull
// CHECK: [[FUNCPTR:%.*]] = load i64, ptr %ptrauth.temp, align 8
func test_field_fn_read() -> Int32 {
let fn = ptr_to_secure_struct!.pointee.secure_func_ptr!
return fn()
}
// CHECK-LABEL: define hidden swiftcc void @"$s25ptrauth_field_fptr_import05test_B14_fn_ptr_modifyyyF"() #0 {
// CHECK: [[SECURESTRUCT:%.*]] = phi ptr [
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, ptr [[SECURESTRUCT]], i32 0, i32 0
// CHECK: store i64 ptrtoint (ptr @returnInt.ptrauth to i64), ptr %ptrauth.temp, align 8
// CHECK: [[LD:%.*]] = load ptr, ptr %ptrauth.temp, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[LD]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull:
// CHECK: [[CAST4:%.*]] = ptrtoint ptr [[LD]] to i64
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 1, i64 88)
// CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to ptr
// CHECK: store ptr [[CAST5]], ptr %.secure_func_ptr, align 8
func test_field_fn_ptr_modify() {
ptr_to_secure_struct!.pointee.secure_func_ptr = returnInt
}
// CHECK: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B8_fn_reads5Int32VyF"() #0 {
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi ptr [ [[CAST0]]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, ptr [[AddressDiscriminatedSecureStruct]], i32 0, i32 0
// CHECK: [[PTR:%.*]] = load ptr, ptr %.secure_func_ptr, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[PTR]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull:
// CHECK: [[ADDR:%.*]] = ptrtoint ptr %.secure_func_ptr to i64
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 88)
// CHECK: [[CAST4:%.*]] = ptrtoint ptr [[PTR]] to i64
// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 1, i64 [[BLEND]], i32 0, i64 0)
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to ptr
// CHECK: store ptr [[AUTHPTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-cont:
// CHECK: [[FUNCPTR:%.*]] = load i64, ptr %ptrauth.temp, align 8
func test_addr_discriminated_field_fn_read() -> Int32 {
let fn = ptr_to_addr_discriminated_secure_struct!.pointee.secure_func_ptr!
return fn()
}
// CHECK-LABEL: define hidden swiftcc void @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B14_fn_ptr_modifyyyF"() #0 {
// CHECK: entry:
// CHECK: [[PTR:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[PTR]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi ptr [ [[CAST0]]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, ptr [[AddressDiscriminatedSecureStruct]], i32 0, i32 0
// CHECK: store i64 ptrtoint (ptr @returnInt.ptrauth to i64), ptr %ptrauth.temp, align 8
// CHECK: [[LD:%.*]] = load ptr, ptr %ptrauth.temp, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[LD]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull:
// CHECK: [[CAST4:%.*]] = ptrtoint ptr %.secure_func_ptr to i64
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST4]], i64 88)
// CHECK: [[CAST5:%.*]] = ptrtoint ptr [[LD]] to i64
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST5]], i32 0, i64 0, i32 1, i64 [[BLEND]])
// CHECK: [[CAST6:%.*]] = inttoptr i64 [[SIGN]] to ptr
// CHECK: store ptr [[CAST6]], ptr %.secure_func_ptr, align 8
func test_addr_discriminated_field_fn_ptr_modify() {
ptr_to_addr_discriminated_secure_struct!.pointee.secure_func_ptr = returnInt
}
// CHECK-LABEL: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import28test_addr_discriminated_copys5Int32VyF"() #0 {
// CHECK: entry:
// CHECK: [[STRUCT:%.*]] = alloca %TSo32AddressDiscriminatedSecureStructV, align 8
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[PHI:%.*]] = phi ptr [ [[CAST0]]
// CHECK: call void @__copy_assignment_8_8_pa1_88_0(ptr [[STRUCT]], ptr [[PHI]])
func test_addr_discriminated_copy() -> Int32 {
let struct_with_signed_val = ptr_to_addr_discriminated_secure_struct.pointee
return struct_with_signed_val.secure_func_ptr()
}
print(test_field_fn_read())
test_field_fn_ptr_modify()
print(test_addr_discriminated_field_fn_read())
test_addr_discriminated_field_fn_ptr_modify()
print(test_addr_discriminated_copy())
|