1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64 -relocation-model=static < %s | FileCheck %s --check-prefixes=CHECK,STATIC
3; RUN: llc -mtriple=aarch64 -relocation-model=pic < %s | FileCheck %s --check-prefixes=CHECK,PIC
4
5@preemptable_var = dso_preemptable global i32 42
6define i32* @get_preemptable_var() nounwind {
7; CHECK-LABEL: get_preemptable_var:
8; CHECK:       // %bb.0:
9; CHECK-NEXT:    adrp x0, :got:preemptable_var
10; CHECK-NEXT:    ldr x0, [x0, :got_lo12:preemptable_var]
11; CHECK-NEXT:    ret
12  ret i32* @preemptable_var
13}
14
15@dsolocal_var = dso_local global i32 42
16define i32* @get_dsolocal_var() nounwind {
17; STATIC-LABEL: get_dsolocal_var:
18; STATIC:       // %bb.0:
19; STATIC-NEXT:    adrp x0, dsolocal_var
20; STATIC-NEXT:    add x0, x0, :lo12:dsolocal_var
21; STATIC-NEXT:    ret
22;
23; PIC-LABEL: get_dsolocal_var:
24; PIC:       // %bb.0:
25; PIC-NEXT:    adrp x0, .Ldsolocal_var$local
26; PIC-NEXT:    add x0, x0, :lo12:.Ldsolocal_var$local
27; PIC-NEXT:    ret
28  ret i32* @dsolocal_var
29}
30
31@weak_dsolocal_var = weak dso_local global i32 42
32define i32* @get_weak_dsolocal_var() nounwind {
33; CHECK-LABEL: get_weak_dsolocal_var:
34; CHECK:       // %bb.0:
35; CHECK-NEXT:    adrp x0, weak_dsolocal_var
36; CHECK-NEXT:    add x0, x0, :lo12:weak_dsolocal_var
37; CHECK-NEXT:    ret
38  ret i32* @weak_dsolocal_var
39}
40
41@hidden_var = hidden global i32 42
42define i32* @get_hidden_var() nounwind {
43; CHECK-LABEL: get_hidden_var:
44; CHECK:       // %bb.0:
45; CHECK-NEXT:    adrp x0, hidden_var
46; CHECK-NEXT:    add x0, x0, :lo12:hidden_var
47; CHECK-NEXT:    ret
48  ret i32* @hidden_var
49}
50
51@protected_var = protected global i32 42
52define i32* @get_protected_var() nounwind {
53; CHECK-LABEL: get_protected_var:
54; CHECK:       // %bb.0:
55; CHECK-NEXT:    adrp x0, protected_var
56; CHECK-NEXT:    add x0, x0, :lo12:protected_var
57; CHECK-NEXT:    ret
58  ret i32* @protected_var
59}
60
61define dso_preemptable void()* @preemptable_func() nounwind {
62; CHECK-LABEL: preemptable_func:
63; CHECK:       // %bb.0:
64; CHECK-NEXT:    adrp x0, :got:preemptable_func
65; CHECK-NEXT:    ldr x0, [x0, :got_lo12:preemptable_func]
66; CHECK-NEXT:    ret
67  ret void()* bitcast(void()*()* @preemptable_func to void()*)
68}
69
70define dso_local void()* @dsolocal_func() nounwind {
71; STATIC-LABEL: dsolocal_func:
72; STATIC:       // %bb.0:
73; STATIC-NEXT:    adrp x0, dsolocal_func
74; STATIC-NEXT:    add x0, x0, :lo12:dsolocal_func
75; STATIC-NEXT:    ret
76;
77; PIC-LABEL: dsolocal_func:
78; PIC:       .Ldsolocal_func$local:
79; PIC-NEXT:  // %bb.0:
80; PIC-NEXT:    adrp x0, .Ldsolocal_func$local
81; PIC-NEXT:    add x0, x0, :lo12:.Ldsolocal_func$local
82; PIC-NEXT:    ret
83  ret void()* bitcast(void()*()* @dsolocal_func to void()*)
84}
85
86define weak dso_local void()* @weak_dsolocal_func() nounwind {
87; CHECK-LABEL: weak_dsolocal_func:
88; CHECK:       // %bb.0:
89; CHECK-NEXT:    adrp x0, weak_dsolocal_func
90; CHECK-NEXT:    add x0, x0, :lo12:weak_dsolocal_func
91; CHECK-NEXT:    ret
92  ret void()* bitcast(void()*()* @weak_dsolocal_func to void()*)
93}
94
95;; bl .Ldsolocal_func$local either resolves to a constant at assembly time
96;; or produces a relocation which can potentially cause a veneer.
97define dso_local void @call_dsolocal_func() nounwind {
98; STATIC-LABEL: call_dsolocal_func:
99; STATIC:       // %bb.0:
100; STATIC-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
101; STATIC-NEXT:    bl dsolocal_func
102; STATIC-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
103; STATIC-NEXT:    ret
104;
105; PIC-LABEL: call_dsolocal_func:
106; PIC:       .Lcall_dsolocal_func$local:
107; PIC-NEXT:  // %bb.0:
108; PIC-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
109; PIC-NEXT:    bl .Ldsolocal_func$local
110; PIC-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
111; PIC-NEXT:    ret
112  call void()* @dsolocal_func()
113  ret void
114}
115