1 ; RUN: llc -global-isel=0 -fast-isel=0 -O0 --relocation-model=pic < %s \
2 ; RUN: -mattr=+pauth -mattr=+fpac | FileCheck %s --check-prefixes=CHECK,DAGISEL,NOTRAP,DAGISEL-NOTRAP
3 ; RUN: llc -global-isel=0 -fast-isel=0 -O0 --relocation-model=pic < %s \
4 ; RUN: -mattr=+pauth | FileCheck %s --check-prefixes=CHECK,DAGISEL,TRAP,DAGISEL-TRAP
6 ; RUN: llc -global-isel=0 -fast-isel=1 -O0 --relocation-model=pic < %s \
7 ; RUN: -mattr=+pauth -mattr=+fpac | FileCheck %s --check-prefixes=CHECK,DAGISEL,NOTRAP,DAGISEL-NOTRAP
8 ; RUN: llc -global-isel=0 -fast-isel=1 -O0 --relocation-model=pic < %s \
9 ; RUN: -mattr=+pauth | FileCheck %s --check-prefixes=CHECK,DAGISEL,TRAP,DAGISEL-TRAP
11 ; RUN: llc -global-isel=1 -global-isel-abort=1 -O0 --relocation-model=pic < %s \
12 ; RUN: -mattr=+pauth -mattr=+fpac | FileCheck %s --check-prefixes=CHECK,GISEL,NOTRAP,GISEL-NOTRAP
13 ; RUN: llc -global-isel=1 -global-isel-abort=1 -O0 --relocation-model=pic < %s \
14 ; RUN: -mattr=+pauth | FileCheck %s --check-prefixes=CHECK,GISEL,TRAP,GISEL-TRAP
16 ;; Note: for FastISel, we fall back to SelectionDAG
18 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
19 target triple = "aarch64-unknown-linux-android"
21 @global = external global i32
24 define ptr @global_addr() #0 {
25 ; CHECK-LABEL: global_addr:
26 ; CHECK: adrp x17, :got_auth:global
27 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:global
28 ; NOTRAP-NEXT: ldr x0, [x17]
29 ; NOTRAP-NEXT: autda x0, x17
30 ; TRAP-NEXT: ldr x16, [x17]
31 ; TRAP-NEXT: autda x16, x17
32 ; TRAP-NEXT: mov x17, x16
33 ; TRAP-NEXT: xpacd x17
34 ; TRAP-NEXT: cmp x16, x17
35 ; TRAP-NEXT: b.eq .Lauth_success_0
36 ; TRAP-NEXT: brk #0xc472
37 ; TRAP-NEXT: .Lauth_success_0:
38 ; TRAP-NEXT: mov x0, x16
44 define i32 @global_load() #0 {
45 ; CHECK-LABEL: global_load:
46 ; CHECK: adrp x17, :got_auth:global
47 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:global
48 ; NOTRAP-NEXT: ldr x8, [x17]
49 ; NOTRAP-NEXT: autda x8, x17
50 ; TRAP-NEXT: ldr x16, [x17]
51 ; TRAP-NEXT: autda x16, x17
52 ; TRAP-NEXT: mov x17, x16
53 ; TRAP-NEXT: xpacd x17
54 ; TRAP-NEXT: cmp x16, x17
55 ; TRAP-NEXT: b.eq .Lauth_success_1
56 ; TRAP-NEXT: brk #0xc472
57 ; TRAP-NEXT: .Lauth_success_1:
58 ; TRAP-NEXT: mov x8, x16
59 ; CHECK-NEXT: ldr w0, [x8]
62 %load = load i32, ptr @global
66 define void @global_store() #0 {
67 ; CHECK-LABEL: global_store:
68 ; CHECK: adrp x17, :got_auth:global
69 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:global
70 ; GISEL-NOTRAP-NEXT: ldr x8, [x17]
71 ; GISEL-NOTRAP-NEXT: autda x8, x17
72 ; GISEL-TRAP-NEXT: ldr x16, [x17]
73 ; GISEL-TRAP-NEXT: autda x16, x17
74 ; DAGISEL-NOTRAP-NEXT: ldr x9, [x17]
75 ; DAGISEL-NOTRAP-NEXT: autda x9, x17
76 ; DAGISEL-TRAP-NEXT: ldr x16, [x17]
77 ; DAGISEL-TRAP-NEXT: autda x16, x17
78 ; TRAP-NEXT: mov x17, x16
79 ; TRAP-NEXT: xpacd x17
80 ; TRAP-NEXT: cmp x16, x17
81 ; TRAP-NEXT: b.eq .Lauth_success_2
82 ; TRAP-NEXT: brk #0xc472
83 ; TRAP-NEXT: .Lauth_success_2:
84 ; GISEL-TRAP-NEXT: mov x8, x16
85 ; DAGISEL-TRAP-NEXT: mov x9, x16
86 ; GISEL-NEXT: str wzr, [x8]
87 ; DAGISEL-NEXT: mov w8, wzr
88 ; DAGISEL-NEXT: str w8, [x9]
90 store i32 0, ptr @global
94 define ptr @func_addr() #0 {
95 ; CHECK-LABEL: func_addr:
96 ; CHECK: adrp x17, :got_auth:func
97 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:func
98 ; NOTRAP-NEXT: ldr x0, [x17]
99 ; NOTRAP-NEXT: autia x0, x17
100 ; TRAP-NEXT: ldr x16, [x17]
101 ; TRAP-NEXT: autia x16, x17
102 ; TRAP-NEXT: mov x17, x16
103 ; TRAP-NEXT: xpaci x17
104 ; TRAP-NEXT: cmp x16, x17
105 ; TRAP-NEXT: b.eq .Lauth_success_3
106 ; TRAP-NEXT: brk #0xc470
107 ; TRAP-NEXT: .Lauth_success_3:
108 ; TRAP-NEXT: mov x0, x16
114 attributes #0 = { "target-features"="+tagged-globals" }
116 !llvm.module.flags = !{!0}
117 !0 = !{i32 8, !"ptrauth-elf-got", i32 1}