xref: /llvm-project/llvm/test/CodeGen/AArch64/ptrauth-extern-weak.ll (revision 0ed696e5a3d715fea779579aa3be2c8a338aa7ec)
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