117 lines · plain
1; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=0 -fast-isel=0 -relocation-model=pic \2; RUN: -mattr=+pauth -mattr=+fpac -o - %s | FileCheck --check-prefixes=CHECK,NOTRAP %s3; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=0 -fast-isel=0 -relocation-model=pic \4; RUN: -mattr=+pauth -o - %s | FileCheck --check-prefixes=CHECK,TRAP %s5 6; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=0 -fast-isel=1 -relocation-model=pic \7; RUN: -mattr=+pauth -mattr=+fpac -o - %s | FileCheck --check-prefixes=CHECK,NOTRAP %s8; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=0 -fast-isel=1 -relocation-model=pic \9; RUN: -mattr=+pauth -o - %s | FileCheck --check-prefixes=CHECK,TRAP %s10 11; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=1 -global-isel-abort=1 -relocation-model=pic \12; RUN: -mattr=+pauth -mattr=+fpac -o - %s | FileCheck --check-prefixes=CHECK,NOTRAP %s13; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel=1 -global-isel-abort=1 -relocation-model=pic \14; RUN: -mattr=+pauth -o - %s | FileCheck --check-prefixes=CHECK,TRAP %s15 16; RUN: llc -mtriple=aarch64-none-linux-gnu -code-model=tiny -mattr=+pauth -mattr=+fpac -o - %s | \17; RUN: FileCheck --check-prefixes=CHECK-TINY,NOTRAP-TINY %s18; RUN: llc -mtriple=aarch64-none-linux-gnu -code-model=tiny -mattr=+pauth -o - %s | \19; RUN: FileCheck --check-prefixes=CHECK-TINY,TRAP-TINY %s20 21;; Note: for FastISel, we fall back to SelectionDAG22 23declare extern_weak dso_local i32 @var()24 25define ptr @foo() {26; The usual ADRP/ADD pair can't be used for a weak reference because it must27; evaluate to 0 if the symbol is undefined. We use a GOT entry for PIC28; otherwise a litpool entry.29 ret ptr @var30 31; CHECK-LABEL: foo:32; CHECK: adrp x17, :got_auth:var33; CHECK-NEXT: add x17, x17, :got_auth_lo12:var34; NOTRAP-NEXT: ldr x0, [x17]35; NOTRAP-NEXT: cbz x0, .Lundef_weak036; NOTRAP-NEXT: autia x0, x1737; TRAP-NEXT: ldr x16, [x17]38; TRAP-NEXT: cbz x16, .Lundef_weak039; TRAP-NEXT: autia x16, x1740; CHECK-NEXT: .Lundef_weak0:41; TRAP-NEXT: mov x17, x1642; TRAP-NEXT: xpaci x1743; TRAP-NEXT: cmp x16, x1744; TRAP-NEXT: b.eq .Lauth_success_045; TRAP-NEXT: brk #0xc47046; TRAP-NEXT: .Lauth_success_0:47; TRAP-NEXT: mov x0, x1648; CHECK-NEXT: ret49 50; CHECK-TINY-LABEL: foo:51; CHECK-TINY: adr x17, :got_auth:var52; NOTRAP-TINY-NEXT: ldr x0, [x17]53; NOTRAP-TINY-NEXT: cbz x0, .Lundef_weak054; NOTRAP-TINY-NEXT: autia x0, x1755; TRAP-TINY-NEXT: ldr x16, [x17]56; TRAP-TINY-NEXT: cbz x16, .Lundef_weak057; TRAP-TINY-NEXT: autia x16, x1758; CHECK-TINY-NEXT: .Lundef_weak0:59; TRAP-TINY-NEXT: mov x17, x1660; TRAP-TINY-NEXT: xpaci x1761; TRAP-TINY-NEXT: cmp x16, x1762; TRAP-TINY-NEXT: b.eq .Lauth_success_063; TRAP-TINY-NEXT: brk #0xc47064; TRAP-TINY-NEXT: .Lauth_success_0:65; TRAP-TINY-NEXT: mov x0, x1666; CHECK-TINY-NEXT: ret67}68 69@arr_var = extern_weak global [10 x i32]70 71define ptr @bar() {72 %addr = getelementptr [10 x i32], ptr @arr_var, i32 0, i32 573 ret ptr %addr74 75; CHECK-LABEL: bar:76; CHECK: adrp x17, :got_auth:arr_var77; CHECK-NEXT: add x17, x17, :got_auth_lo12:arr_var78; NOTRAP-NEXT: ldr x8, [x17]79; NOTRAP-NEXT: cbz x8, .Lundef_weak180; NOTRAP-NEXT: autda x8, x1781; TRAP-NEXT: ldr x16, [x17]82; TRAP-NEXT: cbz x16, .Lundef_weak183; TRAP-NEXT: autda x16, x1784; CHECK-NEXT: .Lundef_weak1:85; TRAP-NEXT: mov x17, x1686; TRAP-NEXT: xpacd x1787; TRAP-NEXT: cmp x16, x1788; TRAP-NEXT: b.eq .Lauth_success_189; TRAP-NEXT: brk #0xc47290; TRAP-NEXT: .Lauth_success_1:91; TRAP-NEXT: mov x8, x1692; CHECK-NEXT: add x0, x8, #2093; CHECK-NEXT: ret94 95; CHECK-TINY-LABEL: bar:96; CHECK-TINY: adr x17, :got_auth:arr_var97; NOTRAP-TINY-NEXT: ldr x8, [x17]98; NOTRAP-TINY-NEXT: cbz x8, .Lundef_weak199; NOTRAP-TINY-NEXT: autda x8, x17100; TRAP-TINY-NEXT: ldr x16, [x17]101; TRAP-TINY-NEXT: cbz x16, .Lundef_weak1102; TRAP-TINY-NEXT: autda x16, x17103; CHECK-TINY-NEXT: .Lundef_weak1:104; TRAP-TINY-NEXT: mov x17, x16105; TRAP-TINY-NEXT: xpacd x17106; TRAP-TINY-NEXT: cmp x16, x17107; TRAP-TINY-NEXT: b.eq .Lauth_success_1108; TRAP-TINY-NEXT: brk #0xc472109; TRAP-TINY-NEXT: .Lauth_success_1:110; TRAP-TINY-NEXT: mov x8, x16111; CHECK-TINY-NEXT: add x0, x8, #20112; CHECK-TINY-NEXT: ret113}114 115!llvm.module.flags = !{!0}116!0 = !{i32 8, !"ptrauth-elf-got", i32 1}117