1; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -relocation-model=pic %s -o - | FileCheck %s
2; RUN: llc -mtriple=arm64-linux-gnu -verify-machineinstrs -relocation-model=pic %s -o - | FileCheck %s
3
4@var = global i32 0
5
6define i32 @get_globalvar() {
7; CHECK-LABEL: get_globalvar:
8
9  %val = load i32* @var
10; CHECK: adrp x[[GOTHI:[0-9]+]], :got:var
11; CHECK: ldr x[[GOTLOC:[0-9]+]], [x[[GOTHI]], {{#?}}:got_lo12:var]
12; CHECK: ldr w0, [x[[GOTLOC]]]
13
14  ret i32 %val
15}
16
17define i32* @get_globalvaraddr() {
18; CHECK-LABEL: get_globalvaraddr:
19
20  %val = load i32* @var
21; CHECK: adrp x[[GOTHI:[0-9]+]], :got:var
22; CHECK: ldr x0, [x[[GOTHI]], {{#?}}:got_lo12:var]
23
24  ret i32* @var
25}
26
27@hiddenvar = hidden global i32 0
28
29define i32 @get_hiddenvar() {
30; CHECK-LABEL: get_hiddenvar:
31
32  %val = load i32* @hiddenvar
33; CHECK: adrp x[[HI:[0-9]+]], hiddenvar
34; CHECK: ldr w0, [x[[HI]], {{#?}}:lo12:hiddenvar]
35
36  ret i32 %val
37}
38
39define i32* @get_hiddenvaraddr() {
40; CHECK-LABEL: get_hiddenvaraddr:
41
42  %val = load i32* @hiddenvar
43; CHECK: adrp [[HI:x[0-9]+]], hiddenvar
44; CHECK: add x0, [[HI]], {{#?}}:lo12:hiddenvar
45
46  ret i32* @hiddenvar
47}
48
49define void()* @get_func() {
50; CHECK-LABEL: get_func:
51
52  ret void()* bitcast(void()*()* @get_func to void()*)
53; CHECK: adrp x[[GOTHI:[0-9]+]], :got:get_func
54; CHECK: ldr x0, [x[[GOTHI]], {{#?}}:got_lo12:get_func]
55}
56