brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 0310535 Raw
169 lines · cpp
1// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -std=c++11 -emit-llvm %s  -o - | FileCheck -check-prefixes=CHECK,IOS %s2// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -std=c++11 -emit-llvm %s  -o - | FileCheck %s3 4#define AQ __ptrauth(1,1,50)5#define IQ __ptrauth(1,0,50)6 7// CHECK: %[[STRUCT_SA:.*]] = type { ptr, ptr }8// CHECK: %[[STRUCT_SI:.*]] = type { ptr }9 10struct SA {11  int * AQ m0; // Signed using address discrimination.12  int * AQ m1; // Signed using address discrimination.13};14 15struct SI {16  int * IQ m; // No address discrimination.17};18 19struct __attribute__((trivial_abi)) TrivialSA {20  int * AQ m0; // Signed using address discrimination.21  int * AQ m1; // Signed using address discrimination.22};23 24// Check that TrivialSA is passed indirectly despite being annotated with25// 'trivial_abi'.26 27// CHECK: define {{.*}}void @_Z18testParamTrivialSA9TrivialSA(ptr dead_on_return noundef %{{.*}})28 29void testParamTrivialSA(TrivialSA a) {30}31 32// CHECK: define {{.*}}void @_Z19testCopyConstructor2SA(ptr33// CHECK: call {{.*}}@_ZN2SAC1ERKS_(34 35// CHECK: define linkonce_odr {{.*}}@_ZN2SAC1ERKS_(36// CHECK: call {{.*}}@_ZN2SAC2ERKS_(37 38void testCopyConstructor(SA a) {39  SA t = a;40}41 42// CHECK: define {{.*}}void @_Z19testMoveConstructor2SA(ptr43// CHECK: call {{.*}}@_ZN2SAC1EOS_(44 45// CHECK: define linkonce_odr {{.*}}@_ZN2SAC1EOS_(46// CHECK: call {{.*}}@_ZN2SAC2EOS_(47 48void testMoveConstructor(SA a) {49  SA t = static_cast<SA &&>(a);50}51 52// CHECK: define {{.*}}void @_Z18testCopyAssignment2SA(ptr53// CHECK: call noundef nonnull align 8 dereferenceable(16) ptr @_ZN2SAaSERKS_(54 55// CHECK: define {{.*}}linkonce_odr noundef nonnull align 8 dereferenceable(16) ptr @_ZN2SAaSERKS_(ptr noundef nonnull align 8 dereferenceable(16) %[[THIS:.*]], ptr noundef nonnull align 8 dereferenceable(16) %0)56// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 857// CHECK: %[[_ADDR:.*]] = alloca ptr, align 858// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 859// CHECK: store ptr %[[V0:.*]], ptr %[[_ADDR]], align 860// CHECK: %[[THISI:.*]] = load ptr, ptr %[[THIS_ADDR]], align 861// CHECK: %[[M0:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[THISI]], i32 0, i32 062// CHECK: %[[V1:.*]] = load ptr, ptr %[[_ADDR]], align 863// CHECK: %[[M02:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[V1]], i32 0, i32 064// CHECK: %[[V2:.*]] = load ptr, ptr %[[M02]], align 865// CHECK: %[[V3:.*]] = ptrtoint ptr %[[M02]] to i6466// CHECK: %[[V4:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V3]], i64 50)67// CHECK: %[[V5:.*]] = ptrtoint ptr %[[M0]] to i6468// CHECK: %[[V6:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V5]], i64 50)69// CHECK: %[[V8:.*]] = ptrtoint ptr %[[V2]] to i6470// CHECK: %[[V9:.*]] = call i64 @llvm.ptrauth.resign(i64 %[[V8]], i32 1, i64 %[[V4]], i32 1, i64 %[[V6]])71 72void testCopyAssignment(SA a) {73  SA t;74  t = a;75}76 77// CHECK: define {{.*}}void @_Z18testMoveAssignment2SA(ptr78// CHECK: call noundef nonnull align 8 dereferenceable(16) ptr @_ZN2SAaSEOS_(79 80// CHECK: define {{.*}}linkonce_odr noundef nonnull align 8 dereferenceable(16) ptr @_ZN2SAaSEOS_(ptr noundef nonnull align 8 dereferenceable(16) %[[THIS:.*]], ptr noundef nonnull align 8 dereferenceable(16) %0)81// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 882// CHECK: %[[_ADDR:.*]] = alloca ptr, align 883// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 884// CHECK: store ptr %[[V0:.*]], ptr %[[_ADDR]], align 885// CHECK: %[[THISI:.*]] = load ptr, ptr %[[THIS_ADDR]], align 886// CHECK: %[[M0:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[THISI]], i32 0, i32 087// CHECK: %[[V1:.*]] = load ptr, ptr %[[_ADDR]], align 888// CHECK: %[[M02:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[V1]], i32 0, i32 089// CHECK: %[[V2:.*]] = load ptr, ptr %[[M02]], align 890// CHECK: %[[V3:.*]] = ptrtoint ptr %[[M02]] to i6491// CHECK: %[[V4:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V3]], i64 50)92// CHECK: %[[V5:.*]] = ptrtoint ptr %[[M0]] to i6493// CHECK: %[[V6:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V5]], i64 50)94// CHECK: %[[V8:.*]] = ptrtoint ptr %[[V2]] to i6495// CHECK: %[[V9:.*]] = call i64 @llvm.ptrauth.resign(i64 %[[V8]], i32 1, i64 %[[V4]], i32 1, i64 %[[V6]])96 97void testMoveAssignment(SA a) {98  SA t;99  t = static_cast<SA &&>(a);100}101 102// CHECK: define {{.*}}void @_Z19testCopyConstructor2SI(103// CHECK: call void @llvm.memcpy.p0.p0.i64(104 105void testCopyConstructor(SI a) {106  SI t = a;107}108 109// CHECK: define {{.*}}void @_Z19testMoveConstructor2SI(110// CHECK: call void @llvm.memcpy.p0.p0.i64(111 112void testMoveConstructor(SI a) {113  SI t = static_cast<SI &&>(a);114}115 116// CHECK: define {{.*}}void @_Z18testCopyAssignment2SI(117// CHECK: call void @llvm.memcpy.p0.p0.i64(118 119void testCopyAssignment(SI a) {120  SI t;121  t = a;122}123 124// CHECK: define {{.*}}void @_Z18testMoveAssignment2SI(125// CHECK: call void @llvm.memcpy.p0.p0.i64(126 127void testMoveAssignment(SI a) {128  SI t;129  t = static_cast<SI &&>(a);130}131 132// CHECK: define linkonce_odr {{.*}}@_ZN2SAC2ERKS_(ptr noundef nonnull align 8 dereferenceable(16) %[[THIS:.*]], ptr noundef nonnull align 8 dereferenceable(16) %0)133// IOS: %[[RETVAL:.*]] = alloca ptr, align 8134// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 8135// CHECK: %[[_ADDR:.*]] = alloca ptr, align 8136// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 8137// CHECK: store ptr %[[V0:.*]], ptr %[[_ADDR]], align 8138// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align 8139// IOS: store ptr %[[THIS1]], ptr %[[RETVAL]], align 8140// CHECK: %[[M0:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[THIS1]], i32 0, i32 0141// CHECK: %[[V1:.*]] = load ptr, ptr %[[_ADDR]], align 8142// CHECK: %[[M02:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[V1]], i32 0, i32 0143// CHECK: %[[V2:.*]] = load ptr, ptr %[[M02]], align 8144// CHECK: %[[V3:.*]] = ptrtoint ptr %[[M02]] to i64145// CHECK: %[[V4:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V3]], i64 50)146// CHECK: %[[V5:.*]] = ptrtoint ptr %[[M0]] to i64147// CHECK: %[[V6:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V5]], i64 50)148// CHECK: %[[V8:.*]] = ptrtoint ptr %[[V2]] to i64149// CHECK: %[[V9:.*]] = call i64 @llvm.ptrauth.resign(i64 %[[V8]], i32 1, i64 %[[V4]], i32 1, i64 %[[V6]])150 151// CHECK: define linkonce_odr {{.*}}@_ZN2SAC2EOS_(ptr noundef nonnull align 8 dereferenceable(16) %[[THIS:.*]], ptr noundef nonnull align 8 dereferenceable(16) %0)152// IOS: %[[RETVAL:.*]] = alloca ptr, align 8153// CHECK: %[[THIS_ADDR:.*]] = alloca ptr, align 8154// CHECK: %[[_ADDR:.*]] = alloca ptr, align 8155// CHECK: store ptr %[[THIS]], ptr %[[THIS_ADDR]], align 8156// CHECK: store ptr %[[V0:.*]], ptr %[[_ADDR]], align 8157// CHECK: %[[THIS1:.*]] = load ptr, ptr %[[THIS_ADDR]], align 8158// IOS: store ptr %[[THIS1]], ptr %[[RETVAL]], align 8159// CHECK: %[[M0:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[THIS1]], i32 0, i32 0160// CHECK: %[[V1:.*]] = load ptr, ptr %[[_ADDR]], align 8161// CHECK: %[[M02:.*]] = getelementptr inbounds nuw %[[STRUCT_SA]], ptr %[[V1]], i32 0, i32 0162// CHECK: %[[V2:.*]] = load ptr, ptr %[[M02]], align 8163// CHECK: %[[V3:.*]] = ptrtoint ptr %[[M02]] to i64164// CHECK: %[[V4:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V3]], i64 50)165// CHECK: %[[V5:.*]] = ptrtoint ptr %[[M0]] to i64166// CHECK: %[[V6:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V5]], i64 50)167// CHECK: %[[V8:.*]] = ptrtoint ptr %[[V2]] to i64168// CHECK: %[[V9:.*]] = call i64 @llvm.ptrauth.resign(i64 %[[V8]], i32 1, i64 %[[V4]], i32 1, i64 %[[V6]])169