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 %s 3; 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 %s 5 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 %s 8; 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 %s 10 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 %s 13; 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 %s 15 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 %s 18; RUN: llc -mtriple=aarch64-none-linux-gnu -code-model=tiny -mattr=+pauth -o - %s | \ 19; RUN: FileCheck --check-prefixes=CHECK-TINY,TRAP-TINY %s 20 21;; Note: for FastISel, we fall back to SelectionDAG 22 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 must 27; evaluate to 0 if the symbol is undefined. We use a GOT entry for PIC 28; otherwise a litpool entry. 29 ret ptr @var 30 31; CHECK-LABEL: foo: 32; CHECK: adrp x17, :got_auth:var 33; CHECK-NEXT: add x17, x17, :got_auth_lo12:var 34; NOTRAP-NEXT: ldr x0, [x17] 35; NOTRAP-NEXT: cbz x0, .Lundef_weak0 36; NOTRAP-NEXT: autia x0, x17 37; TRAP-NEXT: ldr x16, [x17] 38; TRAP-NEXT: cbz x16, .Lundef_weak0 39; TRAP-NEXT: autia x16, x17 40; CHECK-NEXT: .Lundef_weak0: 41; TRAP-NEXT: mov x17, x16 42; TRAP-NEXT: xpaci x17 43; TRAP-NEXT: cmp x16, x17 44; TRAP-NEXT: b.eq .Lauth_success_0 45; TRAP-NEXT: brk #0xc470 46; TRAP-NEXT: .Lauth_success_0: 47; TRAP-NEXT: mov x0, x16 48; CHECK-NEXT: ret 49 50; CHECK-TINY-LABEL: foo: 51; CHECK-TINY: adr x17, :got_auth:var 52; NOTRAP-TINY-NEXT: ldr x0, [x17] 53; NOTRAP-TINY-NEXT: cbz x0, .Lundef_weak0 54; NOTRAP-TINY-NEXT: autia x0, x17 55; TRAP-TINY-NEXT: ldr x16, [x17] 56; TRAP-TINY-NEXT: cbz x16, .Lundef_weak0 57; TRAP-TINY-NEXT: autia x16, x17 58; CHECK-TINY-NEXT: .Lundef_weak0: 59; TRAP-TINY-NEXT: mov x17, x16 60; TRAP-TINY-NEXT: xpaci x17 61; TRAP-TINY-NEXT: cmp x16, x17 62; TRAP-TINY-NEXT: b.eq .Lauth_success_0 63; TRAP-TINY-NEXT: brk #0xc470 64; TRAP-TINY-NEXT: .Lauth_success_0: 65; TRAP-TINY-NEXT: mov x0, x16 66; CHECK-TINY-NEXT: ret 67} 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 5 73 ret ptr %addr 74 75; CHECK-LABEL: bar: 76; CHECK: adrp x17, :got_auth:arr_var 77; CHECK-NEXT: add x17, x17, :got_auth_lo12:arr_var 78; NOTRAP-NEXT: ldr x8, [x17] 79; NOTRAP-NEXT: cbz x8, .Lundef_weak1 80; NOTRAP-NEXT: autda x8, x17 81; TRAP-NEXT: ldr x16, [x17] 82; TRAP-NEXT: cbz x16, .Lundef_weak1 83; TRAP-NEXT: autda x16, x17 84; CHECK-NEXT: .Lundef_weak1: 85; TRAP-NEXT: mov x17, x16 86; TRAP-NEXT: xpacd x17 87; TRAP-NEXT: cmp x16, x17 88; TRAP-NEXT: b.eq .Lauth_success_1 89; TRAP-NEXT: brk #0xc472 90; TRAP-NEXT: .Lauth_success_1: 91; TRAP-NEXT: mov x8, x16 92; CHECK-NEXT: add x0, x8, #20 93; CHECK-NEXT: ret 94 95; CHECK-TINY-LABEL: bar: 96; CHECK-TINY: adr x17, :got_auth:arr_var 97; NOTRAP-TINY-NEXT: ldr x8, [x17] 98; NOTRAP-TINY-NEXT: cbz x8, .Lundef_weak1 99; NOTRAP-TINY-NEXT: autda x8, x17 100; TRAP-TINY-NEXT: ldr x16, [x17] 101; TRAP-TINY-NEXT: cbz x16, .Lundef_weak1 102; TRAP-TINY-NEXT: autda x16, x17 103; CHECK-TINY-NEXT: .Lundef_weak1: 104; TRAP-TINY-NEXT: mov x17, x16 105; TRAP-TINY-NEXT: xpacd x17 106; TRAP-TINY-NEXT: cmp x16, x17 107; TRAP-TINY-NEXT: b.eq .Lauth_success_1 108; TRAP-TINY-NEXT: brk #0xc472 109; TRAP-TINY-NEXT: .Lauth_success_1: 110; TRAP-TINY-NEXT: mov x8, x16 111; CHECK-TINY-NEXT: add x0, x8, #20 112; CHECK-TINY-NEXT: ret 113} 114 115!llvm.module.flags = !{!0} 116!0 = !{i32 8, !"ptrauth-elf-got", i32 1} 117