183 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \2; RUN: -relocation-model=pic < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s3; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \4; RUN: -relocation-model=pic < %s | FileCheck --check-prefixes=CHECK,TRAP %s5 6; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \7; RUN: -relocation-model=pic -fast-isel < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s8; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \9; RUN: -relocation-model=pic -fast-isel < %s | FileCheck --check-prefixes=CHECK,TRAP %s10 11; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \12; RUN: -relocation-model=pic -global-isel -global-isel-abort=1 < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s13; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \14; RUN: -relocation-model=pic -global-isel -global-isel-abort=1 < %s | FileCheck --check-prefixes=CHECK,TRAP %s15 16; Note: fast-isel tests here will fall back to isel17 18@src = external local_unnamed_addr global [65536 x i8], align 119@dst = external global [65536 x i8], align 120@ptr = external local_unnamed_addr global ptr, align 821 22define dso_preemptable void @foo1() {23; CHECK-LABEL: foo1:24; CHECK: // %bb.0: // %entry25; CHECK-NEXT: adr x17, :got_auth:src26; NOTRAP-NEXT: ldr x8, [x17]27; NOTRAP-NEXT: autda x8, x1728; TRAP-NEXT: ldr x16, [x17]29; TRAP-NEXT: autda x16, x1730; TRAP-NEXT: mov x17, x1631; TRAP-NEXT: xpacd x1732; TRAP-NEXT: cmp x16, x1733; TRAP-NEXT: b.eq .Lauth_success_034; TRAP-NEXT: brk #0xc47235; TRAP-NEXT: .Lauth_success_0:36; TRAP-NEXT: mov x8, x1637; CHECK-NEXT: ldrb w8, [x8]38; CHECK-NEXT: adr x17, :got_auth:dst39; NOTRAP-NEXT: ldr x9, [x17]40; NOTRAP-NEXT: autda x9, x1741; TRAP-NEXT: ldr x16, [x17]42; TRAP-NEXT: autda x16, x1743; TRAP-NEXT: mov x17, x1644; TRAP-NEXT: xpacd x1745; TRAP-NEXT: cmp x16, x1746; TRAP-NEXT: b.eq .Lauth_success_147; TRAP-NEXT: brk #0xc47248; TRAP-NEXT: .Lauth_success_1:49; TRAP-NEXT: mov x9, x1650; CHECK-NEXT: strb w8, [x9]51; CHECK-NEXT: ret52 53entry:54 %0 = load i8, ptr @src, align 155 store i8 %0, ptr @dst, align 156 ret void57}58 59define dso_preemptable void @foo2() {60; CHECK-LABEL: foo2:61; CHECK: // %bb.0: // %entry62; CHECK-NEXT: adr x17, :got_auth:ptr63; NOTRAP-NEXT: ldr x8, [x17]64; NOTRAP-NEXT: autda x8, x1765; TRAP-NEXT: ldr x16, [x17]66; TRAP-NEXT: autda x16, x1767; TRAP-NEXT: mov x17, x1668; TRAP-NEXT: xpacd x1769; TRAP-NEXT: cmp x16, x1770; TRAP-NEXT: b.eq .Lauth_success_271; TRAP-NEXT: brk #0xc47272; TRAP-NEXT: .Lauth_success_2:73; TRAP-NEXT: mov x8, x1674; CHECK-NEXT: adr x17, :got_auth:dst75; NOTRAP-NEXT: ldr x9, [x17]76; NOTRAP-NEXT: autda x9, x1777; TRAP-NEXT: ldr x16, [x17]78; TRAP-NEXT: autda x16, x1779; TRAP-NEXT: mov x17, x1680; TRAP-NEXT: xpacd x1781; TRAP-NEXT: cmp x16, x1782; TRAP-NEXT: b.eq .Lauth_success_383; TRAP-NEXT: brk #0xc47284; TRAP-NEXT: .Lauth_success_3:85; TRAP-NEXT: mov x9, x1686; CHECK-NEXT: str x9, [x8]87; CHECK-NEXT: ret88 89entry:90 store ptr @dst, ptr @ptr, align 891 ret void92}93 94define dso_preemptable void @foo3() {95; CHECK-LABEL: foo3:96; CHECK: // %bb.0: // %entry97; CHECK-NEXT: adr x17, :got_auth:src98; NOTRAP-NEXT: ldr x8, [x17]99; NOTRAP-NEXT: autda x8, x17100; TRAP-NEXT: ldr x16, [x17]101; TRAP-NEXT: autda x16, x17102; TRAP-NEXT: mov x17, x16103; TRAP-NEXT: xpacd x17104; TRAP-NEXT: cmp x16, x17105; TRAP-NEXT: b.eq .Lauth_success_4106; TRAP-NEXT: brk #0xc472107; TRAP-NEXT: .Lauth_success_4:108; TRAP-NEXT: mov x8, x16109; CHECK-NEXT: ldrb w8, [x8]110; CHECK-NEXT: adr x17, :got_auth:ptr111; NOTRAP-NEXT: ldr x9, [x17]112; NOTRAP-NEXT: autda x9, x17113; TRAP-NEXT: ldr x16, [x17]114; TRAP-NEXT: autda x16, x17115; TRAP-NEXT: mov x17, x16116; TRAP-NEXT: xpacd x17117; TRAP-NEXT: cmp x16, x17118; TRAP-NEXT: b.eq .Lauth_success_5119; TRAP-NEXT: brk #0xc472120; TRAP-NEXT: .Lauth_success_5:121; TRAP-NEXT: mov x9, x16122; CHECK-NEXT: ldr x9, [x9]123; CHECK-NEXT: strb w8, [x9]124; CHECK-NEXT: ret125 126entry:127 %0 = load i8, ptr @src, align 1128 %1 = load ptr, ptr @ptr, align 8129 store i8 %0, ptr %1, align 1130 ret void131}132 133@lsrc = internal global i8 0, align 4134@ldst = internal global i8 0, align 4135@lptr = internal global ptr null, align 8136 137declare void @func(...)138 139define dso_preemptable ptr @externfuncaddr() {140; CHECK-LABEL: externfuncaddr:141; CHECK: // %bb.0: // %entry142; CHECK-NEXT: adr x17, :got_auth:func143; NOTRAP-NEXT: ldr x0, [x17]144; NOTRAP-NEXT: autia x0, x17145; TRAP-NEXT: ldr x16, [x17]146; TRAP-NEXT: autia x16, x17147; TRAP-NEXT: mov x17, x16148; TRAP-NEXT: xpaci x17149; TRAP-NEXT: cmp x16, x17150; TRAP-NEXT: b.eq .Lauth_success_6151; TRAP-NEXT: brk #0xc470152; TRAP-NEXT: .Lauth_success_6:153; TRAP-NEXT: mov x0, x16154; CHECK-NEXT: ret155 156entry:157 ret ptr @func158}159 160define dso_preemptable ptr @localfuncaddr() {161; CHECK-LABEL: localfuncaddr:162; CHECK: // %bb.0: // %entry163; CHECK-NEXT: adr x17, :got_auth:externfuncaddr164; NOTRAP-NEXT: ldr x0, [x17]165; NOTRAP-NEXT: autia x0, x17166; TRAP-NEXT: ldr x16, [x17]167; TRAP-NEXT: autia x16, x17168; TRAP-NEXT: mov x17, x16169; TRAP-NEXT: xpaci x17170; TRAP-NEXT: cmp x16, x17171; TRAP-NEXT: b.eq .Lauth_success_7172; TRAP-NEXT: brk #0xc470173; TRAP-NEXT: .Lauth_success_7:174; TRAP-NEXT: mov x0, x16175; CHECK-NEXT: ret176 177entry:178 ret ptr @externfuncaddr179}180 181!llvm.module.flags = !{!0}182!0 = !{i32 8, !"ptrauth-elf-got", i32 1}183