brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · dcce576 Raw
220 lines · c
1// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -emit-llvm %s -O0 -o - | FileCheck %s2 3#define __ptrauth(...) __ptrauth(__VA_ARGS__)4 5__INTPTR_TYPE__ __ptrauth(1, 0, 56) g1 = 0;6// CHECK: @g1 = global i64 07__INTPTR_TYPE__ __ptrauth(1, 1, 1272) g2 = 0;8// CHECK: @g2 = global i64 09extern __UINTPTR_TYPE__ test_int;10__UINTPTR_TYPE__ __ptrauth(3, 1, 23) g3 = (__UINTPTR_TYPE__)&test_int;11// CHECK: @test_int = external global i6412// CHECK: @g3 = global i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 3, i64 23, ptr @g3) to i64)13 14__INTPTR_TYPE__ __ptrauth(1, 1, 712) ga[3] = {0,0,(__UINTPTR_TYPE__)&test_int};15 16// CHECK: @ga = global [3 x i64] [i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 712, ptr getelementptr inbounds ([3 x i64], ptr @ga, i32 0, i32 2)) to i64)]17 18struct A {19  __INTPTR_TYPE__ __ptrauth(1, 0, 431) f0;20  __INTPTR_TYPE__ __ptrauth(1, 0, 9182) f1;21  __INTPTR_TYPE__ __ptrauth(1, 0, 783) f2;22};23 24struct A gs1 = {0, 0, (__UINTPTR_TYPE__)&test_int};25// CHECK: @gs1 = global %struct.A { i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 783) to i64) }26 27struct B {28  __INTPTR_TYPE__ __ptrauth(1, 1, 1276) f0;29  __INTPTR_TYPE__ __ptrauth(1, 1, 23674) f1;30  __INTPTR_TYPE__ __ptrauth(1, 1, 163) f2;31};32 33struct B gs2 = {0, 0, (__UINTPTR_TYPE__)&test_int};34// CHECK: @gs2 = global %struct.B { i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 163, ptr getelementptr inbounds (%struct.B, ptr @gs2, i32 0, i32 2)) to i64) }35 36// CHECK-LABEL: i64 @test_read_globals37__INTPTR_TYPE__ test_read_globals() {38  __INTPTR_TYPE__ result = g1 + g2 + g3;39  // CHECK: [[A:%.*]] = load i64, ptr @g140  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[A]], i32 1, i64 56)41  // CHECK: [[B:%.*]] = load i64, ptr @g242  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @g2 to i64), i64 1272)43  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[B]], i32 1, i64 [[BLENDED]])44  // CHECK: [[VALUE:%.*]] = load i64, ptr @g345  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @g3 to i64), i64 23)46  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 3, i64 [[BLENDED]])47 48  for (int i = 0; i < 3; i++) {49    result += ga[i];50  }51  // CHECK: for.cond:52  // CHECK: [[TEMP:%.*]] = load i32, ptr [[IDX_ADDR:%.*]]53 54  // CHECK: for.body:55  // CHECK: [[IDX:%.*]] = load i32, ptr [[IDX_ADDR]]56  // CHECK: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i6457  // CHECK: [[ARRAYIDX:%.*]] = getelementptr inbounds [3 x i64], ptr @ga, i64 0, i64 [[IDXPROM]]58  // CHECK: [[VALUE:%.*]] = load i64, ptr [[ARRAYIDX]]59  // CHECK: [[CASTIDX:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i6460  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTIDX]], i64 712)61  // CHECK: resign.nonnull6:62  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])63  // CHECK: resign.cont764 65  result += gs1.f0 + gs1.f1 + gs1.f2;66  // CHECK: resign.cont10:67  // CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (%struct.A, ptr @gs1, i32 0, i32 168  // CHECK: resign.nonnull11:69  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 9182)70  // CHECK: resign.cont12:71  // CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (%struct.A, ptr @gs1, i32 0, i32 2)72  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 783)73  result += gs2.f0 + gs2.f1 + gs2.f2;74  // CHECK: [[ADDR:%.*]] = load i64, ptr @gs275  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @gs2 to i64), i64 1276)76  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 [[BLENDED]])77  // CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (%struct.B, ptr @gs2, i32 0, i32 1)78  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr getelementptr inbounds nuw (%struct.B, ptr @gs2, i32 0, i32 1) to i64), i64 23674)79  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 [[BLENDED]])80  // CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (%struct.B, ptr @gs2, i32 0, i32 2)81  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr getelementptr inbounds nuw (%struct.B, ptr @gs2, i32 0, i32 2) to i64), i64 163)82 83  return result;84}85 86// CHECK-LABEL: void @test_write_globals87void test_write_globals(int i, __INTPTR_TYPE__ j) {88  g1 = i;89  g2 = j;90  g3 = 0;91  ga[0] = i;92  ga[1] = j;93  ga[2] = 0;94  gs1.f0 = i;95  gs1.f1 = j;96  gs1.f2 = 0;97  gs2.f0 = i;98  gs2.f1 = j;99  gs2.f2 = 0;100}101 102// CHECK-LABEL: define void @test_set_A103void test_set_A(struct A *a, __INTPTR_TYPE__ x, int y) {104  a->f0 = x;105  // CHECK: [[XADDR:%.*]] = load i64, ptr %x.addr106  // CHECK: [[SIGNED_X:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[XADDR]], i32 1, i64 431)107  a->f1 = y;108  // CHECK: [[Y:%.*]] = load i32, ptr %y.addr109  // CHECK: [[CONV:%.*]] = sext i32 [[Y]] to i64110  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CONV]], i32 1, i64 9182)111  a->f2 = 0;112  // CHECK: [[A:%.*]] = load ptr, ptr %a.addr113  // CHECK: [[F2:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 2114  // CHECK: store i64 0, ptr [[F2]]115}116 117// CHECK-LABEL: define void @test_set_B118void test_set_B(struct B *b, __INTPTR_TYPE__ x, int y) {119  b->f0 = x;120  // CHECK: [[X:%.*]] = load i64, ptr %x.addr121  // CHECK: [[F0_ADDR:%.*]] = ptrtoint ptr %f0 to i64122  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[F0_ADDR]], i64 1276)123  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[X]], i32 1, i64 [[BLENDED]])124  b->f1 = y;125  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr126  // CHECK: [[F1_ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 1127  // CHECK: [[Y:%.*]] = load i32, ptr %y.addr, align 4128  // CHECK: [[CONV:%.*]] = sext i32 [[Y]] to i64129  // CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[F1_ADDR]] to i64130  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 23674)131  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CONV]], i32 1, i64 [[BLENDED]])132  b->f2 = 0;133  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr134  // CHECK: [[F2_ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 2135  // CHECK: store i64 0, ptr [[F2_ADDR]]136}137 138// CHECK-LABEL: define i64 @test_get_A139__INTPTR_TYPE__ test_get_A(struct A *a) {140  return a->f0 + a->f1 + a->f2;141  // CHECK: [[A:%.*]] = load ptr, ptr %a.addr142  // CHECK: [[F0_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 0143  // CHECK: [[F0:%.*]] = load i64, ptr [[F0_ADDR]]144  // CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F0]], i32 1, i64 431)145  // CHECK: [[A:%.*]] = load ptr, ptr %a.addr146  // CHECK: [[F1_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 1147  // CHECK: [[F1:%.*]] = load i64, ptr [[F1_ADDR]]148  // CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F1]], i32 1, i64 9182)149  // CHECK: [[A:%.*]] = load ptr, ptr %a.addr150  // CHECK: [[F2_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 2151  // CHECK: [[F2:%.*]] = load i64, ptr [[F2_ADDR]]152  // CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F2]], i32 1, i64 783)153}154 155// CHECK-LABEL: define i64 @test_get_B156__INTPTR_TYPE__ test_get_B(struct B *b) {157  return b->f0 + b->f1 + b->f2;158  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr159  // CHECK: [[F0:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 0160  // CHECK: [[VALUE:%.*]] = load i64, ptr [[F0]]161  // CHECK: [[CASTF0:%.*]] = ptrtoint ptr %f0 to i64162  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTF0]], i64 1276)163  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])164  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr165  // CHECK: [[ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 1166  // CHECK: [[VALUE:%.*]] = load i64, ptr [[ADDR]]167  // CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[ADDR]] to i64168  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 23674)169  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])170  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr171  // CHECK: [[ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 2172  // CHECK: [[VALUE:%.*]] = load i64, ptr [[ADDR]]173  // CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[ADDR]] to i64174  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 163)175  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])176}177 178// CHECK-LABEL: define void @test_resign179void test_resign(struct A* a, const struct B *b) {180  a->f0 = b->f0;181  // CHECK: [[A:%.*]] = load ptr, ptr %a.addr, align 8182  // CHECK: [[F0:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 0183  // CHECK: [[B:%.*]] = load ptr, ptr %b.addr, align 8184  // CHECK: [[F01:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 0185  // CHECK: [[F01VALUE:%.*]] = load i64, ptr [[F01]]186  // CHECK: [[CASTF01:%.*]] = ptrtoint ptr %f01 to i64187  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTF01]], i64 1276)188  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[F01VALUE]], i32 1, i64 [[BLENDED]], i32 1, i64 431)189}190 191// CHECK-LABEL: define i64 @other_test192__INTPTR_TYPE__ other_test(__INTPTR_TYPE__ i) {193  __INTPTR_TYPE__ __ptrauth(1, 1, 42) j = 0;194  // CHECK: [[J_ADDR:%.*]] = ptrtoint ptr %j to i64195  // CHECK: store i64 0, ptr %j196  __INTPTR_TYPE__ __ptrauth(1, 1, 43) k = 1234;197  // CHECK: [[ADDR:%.*]] = ptrtoint ptr %k to i64198  // CHECK: [[JBLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 43)199  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 1234, i32 1, i64 [[JBLENDED]])200  __INTPTR_TYPE__ __ptrauth(1, 1, 44) l = i;201  // CHECK: [[I:%.*]] = load i64, ptr %i.addr202  // CHECK: [[ADDR:%.*]] = ptrtoint ptr %l to i64203  // CHECK: [[LBLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 44)204  // CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[I]], i32 1, i64 [[LBLENDED]])205  asm volatile ("" ::: "memory");206  return j + k + l;207  // CHECK: [[VALUE:%.*]] = load i64, ptr %j208  // CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr %j to i64209  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 42)210  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])211  // CHECK: [[VALUE:%.*]] = load i64, ptr %k212  // CHECK: [[CASTK:%.*]] = ptrtoint ptr %k to i64213  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTK]], i64 43)214  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])215  // CHECK: [[VALUE:%.*]] = load i64, ptr %l216  // CHECK: [[CASTL:%.*]] = ptrtoint ptr %l to i64217  // CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTL]], i64 44)218  // CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])219}220