1 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=0 -fast-isel=0 -verify-machineinstrs \
2 ; RUN: -relocation-model=pic -mattr=+pauth -mattr=+fpac %s -o - | FileCheck %s --check-prefixes=CHECK,NOTRAP
3 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=0 -fast-isel=0 -verify-machineinstrs \
4 ; RUN: -relocation-model=pic -mattr=+pauth %s -o - | FileCheck %s --check-prefixes=CHECK,TRAP
6 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=0 -fast-isel=1 -verify-machineinstrs \
7 ; RUN: -relocation-model=pic -mattr=+pauth -mattr=+fpac %s -o - | FileCheck %s --check-prefixes=CHECK,NOTRAP
8 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=0 -fast-isel=1 -verify-machineinstrs \
9 ; RUN: -relocation-model=pic -mattr=+pauth %s -o - | FileCheck %s --check-prefixes=CHECK,TRAP
11 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=1 -global-isel-abort=1 -verify-machineinstrs \
12 ; RUN: -relocation-model=pic -mattr=+pauth -mattr=+fpac %s -o - | FileCheck %s --check-prefixes=CHECK,NOTRAP
13 ; RUN: llc -mtriple=aarch64-linux-gnu -global-isel=1 -global-isel-abort=1 -verify-machineinstrs \
14 ; RUN: -relocation-model=pic -mattr=+pauth %s -o - | FileCheck %s --check-prefixes=CHECK,TRAP
16 ;; Note: for FastISel, we fall back to SelectionDAG
20 define i32 @get_globalvar() {
21 ; CHECK-LABEL: get_globalvar:
22 ; CHECK: adrp x17, :got_auth:var
23 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:var
24 ; NOTRAP-NEXT: ldr x8, [x17]
25 ; NOTRAP-NEXT: autda x8, x17
26 ; TRAP-NEXT: ldr x16, [x17]
27 ; TRAP-NEXT: autda x16, x17
28 ; TRAP-NEXT: mov x17, x16
29 ; TRAP-NEXT: xpacd x17
30 ; TRAP-NEXT: cmp x16, x17
31 ; TRAP-NEXT: b.eq .Lauth_success_0
32 ; TRAP-NEXT: brk #0xc472
33 ; TRAP-NEXT: .Lauth_success_0:
34 ; TRAP-NEXT: mov x8, x16
35 ; CHECK-NEXT: ldr w0, [x8]
38 %val = load i32, ptr @var
42 define ptr @get_globalvaraddr() {
43 ; CHECK-LABEL: get_globalvaraddr:
44 ; CHECK: adrp x17, :got_auth:var
45 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:var
46 ; NOTRAP-NEXT: ldr x0, [x17]
47 ; NOTRAP-NEXT: autda x0, x17
48 ; TRAP-NEXT: ldr x16, [x17]
49 ; TRAP-NEXT: autda x16, x17
50 ; TRAP-NEXT: mov x17, x16
51 ; TRAP-NEXT: xpacd x17
52 ; TRAP-NEXT: cmp x16, x17
53 ; TRAP-NEXT: b.eq .Lauth_success_1
54 ; TRAP-NEXT: brk #0xc472
55 ; TRAP-NEXT: .Lauth_success_1:
56 ; TRAP-NEXT: mov x0, x16
59 %val = load i32, ptr @var
65 define ptr @resign_globalfunc() {
66 ; CHECK-LABEL: resign_globalfunc:
67 ; CHECK: adrp x17, :got_auth:foo
68 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:foo
69 ; CHECK-NEXT: ldr x16, [x17]
70 ; CHECK-NEXT: autia x16, x17
71 ; TRAP-NEXT: mov x17, x16
72 ; TRAP-NEXT: xpaci x17
73 ; TRAP-NEXT: cmp x16, x17
74 ; TRAP-NEXT: b.eq .Lauth_success_2
75 ; TRAP-NEXT: brk #0xc470
76 ; TRAP-NEXT: .Lauth_success_2:
77 ; CHECK-NEXT: mov x17, #42
78 ; CHECK-NEXT: pacia x16, x17
79 ; CHECK-NEXT: mov x0, x16
82 ret ptr ptrauth (ptr @foo, i32 0, i64 42)
85 define ptr @resign_globalvar() {
86 ; CHECK-LABEL: resign_globalvar:
87 ; CHECK: adrp x17, :got_auth:var
88 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:var
89 ; CHECK-NEXT: ldr x16, [x17]
90 ; CHECK-NEXT: autda x16, x17
91 ; TRAP-NEXT: mov x17, x16
92 ; TRAP-NEXT: xpacd x17
93 ; TRAP-NEXT: cmp x16, x17
94 ; TRAP-NEXT: b.eq .Lauth_success_3
95 ; TRAP-NEXT: brk #0xc472
96 ; TRAP-NEXT: .Lauth_success_3:
97 ; CHECK-NEXT: mov x17, #43
98 ; CHECK-NEXT: pacdb x16, x17
99 ; CHECK-NEXT: mov x0, x16
102 ret ptr ptrauth (ptr @var, i32 3, i64 43)
105 define ptr @resign_globalvar_offset() {
106 ; CHECK-LABEL: resign_globalvar_offset:
107 ; CHECK: adrp x17, :got_auth:var
108 ; CHECK-NEXT: add x17, x17, :got_auth_lo12:var
109 ; CHECK-NEXT: ldr x16, [x17]
110 ; CHECK-NEXT: autda x16, x17
111 ; TRAP-NEXT: mov x17, x16
112 ; TRAP-NEXT: xpacd x17
113 ; TRAP-NEXT: cmp x16, x17
114 ; TRAP-NEXT: b.eq .Lauth_success_4
115 ; TRAP-NEXT: brk #0xc472
116 ; TRAP-NEXT: .Lauth_success_4:
117 ; CHECK-NEXT: add x16, x16, #16
118 ; CHECK-NEXT: mov x17, #44
119 ; CHECK-NEXT: pacda x16, x17
120 ; CHECK-NEXT: mov x0, x16
123 ret ptr ptrauth (ptr getelementptr (i8, ptr @var, i64 16), i32 2, i64 44)
126 !llvm.module.flags = !{!0}
127 !0 = !{i32 8, !"ptrauth-elf-got", i32 1}