91 lines · c
1// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s2// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s3//4// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s5// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s6 7void (*fnptr)(void);8long int_discriminator;9void *ptr_discriminator;10long signature;11 12// CHECK-LABEL: define {{.*}}void @test_auth()13void test_auth() {14 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,15 // CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,16 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6417 // CHECK-NEXT: [[DISC:%.*]] = ptrtoint ptr [[DISC0]] to i6418 // CHECK-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[T0]], i32 0, i64 [[DISC]])19 // CHECK-NEXT: [[RESULT:%.*]] = inttoptr i64 [[T1]] to ptr20 // CHECK-NEXT: store ptr [[RESULT]], ptr @fnptr,21 fnptr = __builtin_ptrauth_auth(fnptr, 0, ptr_discriminator);22}23 24// CHECK-LABEL: define {{.*}}void @test_strip()25void test_strip() {26 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,27 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6428 // CHECK-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.strip(i64 [[T0]], i32 0)29 // CHECK-NEXT: [[RESULT:%.*]] = inttoptr i64 [[T1]] to ptr30 // CHECK-NEXT: store ptr [[RESULT]], ptr @fnptr,31 fnptr = __builtin_ptrauth_strip(fnptr, 0);32}33 34// CHECK-LABEL: define {{.*}}void @test_sign_unauthenticated()35void test_sign_unauthenticated() {36 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,37 // CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,38 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6439 // CHECK-NEXT: [[DISC:%.*]] = ptrtoint ptr [[DISC0]] to i6440 // CHECK-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[T0]], i32 0, i64 [[DISC]])41 // CHECK-NEXT: [[RESULT:%.*]] = inttoptr i64 [[T1]] to ptr42 // CHECK-NEXT: store ptr [[RESULT]], ptr @fnptr,43 fnptr = __builtin_ptrauth_sign_unauthenticated(fnptr, 0, ptr_discriminator);44}45 46// CHECK-LABEL: define {{.*}}void @test_auth_and_resign()47void test_auth_and_resign() {48 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,49 // CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,50 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6451 // CHECK-NEXT: [[DISC:%.*]] = ptrtoint ptr [[DISC0]] to i6452 // CHECK-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[T0]], i32 0, i64 [[DISC]], i32 3, i64 15)53 // CHECK-NEXT: [[RESULT:%.*]] = inttoptr i64 [[T1]] to ptr54 // CHECK-NEXT: store ptr [[RESULT]], ptr @fnptr,55 fnptr = __builtin_ptrauth_auth_and_resign(fnptr, 0, ptr_discriminator, 3, 15);56}57 58// CHECK-LABEL: define {{.*}}void @test_blend_discriminator()59void test_blend_discriminator() {60 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,61 // CHECK-NEXT: [[DISC:%.*]] = load i64, ptr @int_discriminator,62 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6463 // CHECK-NEXT: [[RESULT:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 [[DISC]])64 // CHECK-NEXT: store i64 [[RESULT]], ptr @int_discriminator,65 int_discriminator = __builtin_ptrauth_blend_discriminator(fnptr, int_discriminator);66}67 68// CHECK-LABEL: define {{.*}}void @test_sign_generic_data()69void test_sign_generic_data() {70 // CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,71 // CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,72 // CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i6473 // CHECK-NEXT: [[DISC:%.*]] = ptrtoint ptr [[DISC0]] to i6474 // CHECK-NEXT: [[RESULT:%.*]] = call i64 @llvm.ptrauth.sign.generic(i64 [[T0]], i64 [[DISC]])75 // CHECK-NEXT: store i64 [[RESULT]], ptr @signature,76 signature = __builtin_ptrauth_sign_generic_data(fnptr, ptr_discriminator);77}78 79// CHECK-LABEL: define {{.*}}void @test_string_discriminator()80void test_string_discriminator() {81 // CHECK: [[X:%.*]] = alloca i3282 83 // Check a couple of random discriminators used by Swift.84 85 // CHECK: store i32 58298, ptr [[X]],86 int x = __builtin_ptrauth_string_discriminator("InitializeWithCopy");87 88 // CHECK: store i32 9112, ptr [[X]],89 x = __builtin_ptrauth_string_discriminator("DestroyArray");90}91