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
|
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import Builtin
// CHECK: @"$sTA.ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"$sTA", i32 0, i64 0, i64 {{.*}} }, section "llvm.ptrauth"
sil @test_thin_indirect : $@convention(thin) (@convention(thin) (Builtin.Int32, Builtin.Int32) -> (), Builtin.Int32) -> @owned @callee_owned () -> () {
bb0(%0 : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> (), %1 : $Builtin.Int32):
%2 = partial_apply %0(%1, %1) : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> ()
return %2 : $@callee_owned () -> ()
}
// CHECK-LABEL: define swiftcc { ptr, ptr } @test_thin_indirect(ptr %0, i32 %1)
// CHECK: [[ALLOC:%.*]] = call {{.*}}swift_allocObject(
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr }>]], ptr [[ALLOC]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 7185)
// CHECK: [[T0:%.*]] = ptrtoint ptr %0 to i64
// CHECK: [[T1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[T0]], i32 0, i64 {{.*}}, i32 1, i64 [[DISC]])
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to ptr
// CHECK: store ptr [[T2]], ptr [[SLOT]], align 8
// CHECK: insertvalue { ptr, ptr } { ptr @"$sTA.ptrauth", ptr undef }, ptr {{.*}}, 1
// CHECK-LABEL: define internal swiftcc void @"$sTA"(ptr swiftself %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr }>]], ptr %0, i32 0, i32 3
// CHECK: [[T0:%.*]] = load ptr, ptr [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 7185)
// CHECK: call swiftcc void [[T0]](i32 {{.*}}, i32 {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]
sil @test_thick_indirect : $@convention(thin) (@callee_owned (Builtin.Int32, Builtin.Int32) -> (), Builtin.Int32) -> @owned @callee_owned () -> () {
bb0(%0 : $@callee_owned (Builtin.Int32, Builtin.Int32) -> (), %1 : $Builtin.Int32):
%2 = partial_apply %0(%1, %1) : $@callee_owned (Builtin.Int32, Builtin.Int32) -> ()
return %2 : $@callee_owned () -> ()
}
// CHECK-LABEL: define swiftcc { ptr, ptr } @test_thick_indirect(ptr %0, ptr %1, i32 %2)
// CHECK: [[ALLOC:%.*]] = call {{.*}}swift_allocObject(
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr, ptr }>]], ptr {{%.*}}, i32 0, i32 4
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 7185)
// CHECK: [[T0:%.*]] = ptrtoint ptr %0 to i64
// CHECK: [[T1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[T0]], i32 0, i64 {{.*}}, i32 1, i64 [[DISC]])
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to ptr
// CHECK: store ptr [[T2]], ptr [[SLOT]], align 8
// CHECK: insertvalue { ptr, ptr } { ptr @"$sTA{{.*}}.ptrauth", ptr undef }, ptr {{.*}}, 1
// CHECK-LABEL: define internal swiftcc void @"$sTA{{.*}}"(ptr swiftself %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds <{ %swift.refcounted, i32, i32, ptr, ptr }>, ptr %0, i32 0, i32 4
// CHECK: [[T0:%.*]] = load ptr, ptr [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 7185)
// CHECK: call swiftcc void [[T0]](i32 {{.*}}, i32 {{.*}}, ptr {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]
|