brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · c5ad036 Raw
104 lines · plain
1// RUN: %clang_cc1 -Wno-everything -fblocks -fptrauth-intrinsics -triple arm64-apple-ios -fobjc-runtime=ios-12.2 -emit-llvm -no-enable-noundef-analysis -fobjc-arc -O2 -disable-llvm-passes -o - %s | FileCheck %s2 3#if __has_feature(ptrauth_objc_signable_class)4struct TestStruct {5  __ptrauth(2, 1, 1234) Class isa;6};7 8@interface TestClass {9@public10  __ptrauth(2, 1, 1234) Class isa;11}12@end13 14struct TestConstStruct {15  __ptrauth(2, 1, 1234) const Class isa;16  __ptrauth(2, 1, 1234) volatile Class visa;17};18 19@interface TestConstClass {20@public21  __ptrauth(2, 1, 1234) const Class isa;22  __ptrauth(2, 1, 1234) volatile Class visa;23}24@end25 26// CHECK-LABEL: define void @setTestStructIsa(ptr %t, ptr %c) #0 {27void setTestStructIsa(struct TestStruct *t, Class c) {28  t->isa = c;29  // CHECK: [[T_ADDR:%.*]] = alloca ptr, align 830  // CHECK: [[C_ADDR:%.*]] = alloca ptr, align 831  // CHECK: store ptr %c, ptr [[C_ADDR]], align 832  // CHECK: [[ISA_SLOT:%.*]] = getelementptr inbounds nuw %struct.TestStruct, ptr %0, i32 0, i32 033  // CHECK: [[C:%.*]] = load ptr, ptr %c.addr, align 834  // CHECK: [[CAST_ISA_SLOT:%.*]] = ptrtoint ptr [[ISA_SLOT]] to i6435  // CHECK: [[BLENDED_VALUE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ISA_SLOT]], i64 1234)36  // CHECK: [[CAST_C:%.*]] = ptrtoint ptr [[C]] to i6437  // CHECK: [[AUTHENTICATED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CAST_C]], i32 2, i64 [[BLENDED_VALUE]])38}39 40// CHECK-LABEL: define void @setTestClassIsa(ptr %t, ptr %c) #0 {41void setTestClassIsa(TestClass *t, Class c) {42  t->isa = c;43  // CHECK: [[T_ADDR:%.*]] = alloca ptr, align 844  // CHECK: [[C_ADDR:%.*]] = alloca ptr, align 845  // CHECK: store ptr %c, ptr [[C_ADDR]], align 846  // CHECK: [[T:%.*]] = load ptr, ptr [[T_ADDR]], align 847  // CHECK: [[IVAR_OFFSET32:%.*]] = load i32, ptr @"OBJC_IVAR_$_TestClass.isa", align 848  // CHECK: [[IVAR_OFFSET64:%.*]] = sext i32 [[IVAR_OFFSET32]] to i6449  // CHECK: [[ADDED_PTR:%.*]] = getelementptr inbounds i8, ptr %1, i64 [[IVAR_OFFSET64]]50  // CHECK: [[C_VALUE:%.*]] = load ptr, ptr [[C_ADDR]], align 851  // CHECK: [[CAST_ISA_SLOT:%.*]] = ptrtoint ptr [[ADDED_PTR]] to i6452  // CHECK: [[BLENDED_VALUE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ISA_SLOT]], i64 1234)53  // CHECK: [[CAST_C_VALUE:%.*]] = ptrtoint ptr [[C_VALUE]] to i6454  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CAST_C_VALUE]], i32 2, i64 [[BLENDED_VALUE]])55}56 57// CHECK-LABEL: define ptr @getTestStructIsa(ptr %t) #0 {58Class getTestStructIsa(struct TestStruct *t) {59  return t->isa;60  // CHECK: [[T_ADDR:%.*]] = alloca ptr, align 861  // CHECK: [[T_VALUE:%.*]] = load ptr, ptr [[T_ADDR]], align 862  // CHECK: [[ISA_SLOT:%.*]] = getelementptr inbounds nuw %struct.TestStruct, ptr [[T_VALUE]], i32 0, i32 063  // CHECK: [[ISA_VALUE:%.*]] = load ptr, ptr [[ISA_SLOT]], align 864  // CHECK: [[CAST_ISA_SLOT:%.*]] = ptrtoint ptr %isa to i6465  // CHECK: [[BLENDED_VALUE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ISA_SLOT]], i64 1234)66  // CHECK: [[CAST_ISA_VALUE:%.*]] = ptrtoint ptr [[ISA_VALUE]] to i6467  // CHECK: [[SIGNED_VALUE:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[CAST_ISA_VALUE]], i32 2, i64 [[BLENDED_VALUE]])68}69 70// CHECK-LABEL: define ptr @getTestClassIsa(ptr %t) #0 {71Class getTestClassIsa(TestClass *t) {72  return t->isa;73  // CHECK: [[T_ADDR:%.*]] = alloca ptr, align 874  // CHECK: [[T:%.*]] = load ptr, ptr [[T_ADDR]], align 875  // CHECK: [[IVAR:%.*]] = load i32, ptr @"OBJC_IVAR_$_TestClass.isa", align 876  // CHECK: [[IVAR_CONV:%.*]] = sext i32 [[IVAR]] to i6477  // CHECK: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[T]], i64 [[IVAR_CONV]]78  // CHECK: [[LOADED_VALUE:%.*]] = load ptr, ptr [[ADD_PTR]], align 879  // CHECK: [[INT_VALUE:%.*]] = ptrtoint ptr [[ADD_PTR]] to i6480  // CHECK: [[BLENDED_VALUE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[INT_VALUE]], i64 1234)81  // CHECK: [[NULL_CHECK:%.*]] = icmp ne ptr [[LOADED_VALUE]], null82  // CHECK: [[CAST_VALUE:%.*]] = ptrtoint ptr [[LOADED_VALUE]] to i6483  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[CAST_VALUE]], i32 2, i64 [[BLENDED_VALUE]])84}85 86// Just enough to verify we do actually authenticate qualified Class87// CHECK: define ptr @getTestConstClassIsa(ptr %t) #0 {88Class getTestConstClassIsa(TestConstClass *t) {89  return t->isa;90  // CHECK: [[T_ADDR:%.*]] = alloca ptr, align 891  // CHECK: [[T:%.*]] = load ptr, ptr [[T_ADDR]], align 892  // CHECK: [[IVAR:%.*]] = load i32, ptr @"OBJC_IVAR_$_TestConstClass.isa", align 893  // CHECK: [[IVAR_CONV:%.*]] = sext i32 [[IVAR]] to i6494  // CHECK: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[T]], i64 [[IVAR_CONV]]95  // CHECK: [[LOADED_VALUE:%.*]] = load ptr, ptr [[ADD_PTR]], align 896  // CHECK: [[INT_VALUE:%.*]] = ptrtoint ptr [[ADD_PTR]] to i6497  // CHECK: [[BLENDED_VALUE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[INT_VALUE]], i64 1234)98  // CHECK: [[NULL_CHECK:%.*]] = icmp ne ptr [[LOADED_VALUE]], null99  // CHECK: [[CAST_VALUE:%.*]] = ptrtoint ptr [[LOADED_VALUE]] to i64100  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[CAST_VALUE]], i32 2, i64 [[BLENDED_VALUE]])101}102 103#endif104