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
|
// 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
// 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
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import Builtin
struct S { var a, b, c: Builtin.NativeObject }
// CHECK: @"$s4test1SVwCP.ptrauth" = private constant {{.*}} i64 55882
// CHECK: @"$s4test1SVwxx.ptrauth" = private constant {{.*}} i64 1272
// CHECK: @"$s4test1SVwcp.ptrauth" = private constant {{.*}} i64 58298
// CHECK: @"$s4test1SVwca.ptrauth" = private constant {{.*}} i64 34641
// CHECK: @__swift_memcpy24_8.ptrauth = private constant {{.*}} i64 18648
// CHECK: @"$s4test1SVwta.ptrauth" = private constant {{.*}} i64 61402
// CHECK: @"$s4test1SVwet.ptrauth" = private constant {{.*}} i64 24816
// CHECK: @"$s4test1SVwst.ptrauth" = private constant {{.*}} i64 41169
sil @test_destroy : $@convention(thin) <T> (@in T) -> () {
bb0(%0 : $*T):
destroy_addr %0 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_copy_init : $@convention(thin) <T> (@in_guaranteed T) -> (@out T) {
bb0(%0 : $*T, %1 : $*T):
copy_addr %1 to [init] %0 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_init(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 58298)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_take_init : $@convention(thin) <T> (@in T) -> (@out T) {
bb0(%0 : $*T, %1 : $*T):
copy_addr [take] %1 to [init] %0 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_init(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 18648)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_copy_assign : $@convention(thin) <T> (@inout T, @in_guaranteed T) -> () {
bb0(%0 : $*T, %1 : $*T):
copy_addr %1 to %0 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_assign(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 34641)
// CHECK-NEXT: call ptr [[T0]](ptr %0, ptr %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_take_assign : $@convention(thin) <T> (@inout T, @in T) -> () {
bb0(%0 : $*T, %1 : $*T):
copy_addr [take] %1 to %0 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_assign(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 61402)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
// Make sure that the local-type-data caching mechanism sets things up right.
sil @test_destroy_twice : $@convention(thin) <T> (@in T, @in T) -> () {
bb0(%0 : $*T, %1 : $*T):
destroy_addr %0 : $*T
destroy_addr %1 : $*T
%result = tuple ()
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy_twice(
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: call void [[T0]](ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
|