xref: /llvm-project/llvm/test/CodeGen/M68k/CodeModel/Small/small-pie-global-access.ll (revision 4cce10743d2275710d3d2e0de8013386a9799092)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -O2 -mtriple=m68k -verify-machineinstrs \
3; RUN:              -code-model=small -relocation-model=pic \
4; RUN:   | FileCheck %s
5
6; External Linkage
7@a = global i32 0, align 4
8
9define i32 @my_access_global_a() #0 {
10; CHECK-LABEL: my_access_global_a:
11; CHECK:         .cfi_startproc
12; CHECK-NEXT:  ; %bb.0: ; %entry
13; CHECK-NEXT:    move.l (a@GOTPCREL,%pc), %a0
14; CHECK-NEXT:    move.l (%a0), %d0
15; CHECK-NEXT:    rts
16entry:
17  %0 = load i32, ptr @a, align 4
18  ret i32 %0
19}
20
21; WeakAny Linkage
22@b = weak global i32 0, align 4
23
24define i32 @my_access_global_b() #0 {
25; CHECK-LABEL: my_access_global_b:
26; CHECK:         .cfi_startproc
27; CHECK-NEXT:  ; %bb.0: ; %entry
28; CHECK-NEXT:    move.l (b@GOTPCREL,%pc), %a0
29; CHECK-NEXT:    move.l (%a0), %d0
30; CHECK-NEXT:    rts
31entry:
32 %0 = load i32, ptr @b, align 4
33 ret i32 %0
34}
35
36; Internal Linkage
37@c = internal global i32 0, align 4
38
39define i32 @my_access_global_c() #0 {
40; CHECK-LABEL: my_access_global_c:
41; CHECK:         .cfi_startproc
42; CHECK-NEXT:  ; %bb.0: ; %entry
43; CHECK-NEXT:    move.l (c,%pc), %d0
44; CHECK-NEXT:    rts
45entry:
46 %0 = load i32, ptr @c, align 4
47 ret i32 %0
48}
49
50; External Linkage, only declaration.
51@d = external global i32, align 4
52
53define i32 @my_access_global_load_d() #0 {
54; CHECK-LABEL: my_access_global_load_d:
55; CHECK:         .cfi_startproc
56; CHECK-NEXT:  ; %bb.0: ; %entry
57; CHECK-NEXT:    move.l (d@GOTPCREL,%pc), %a0
58; CHECK-NEXT:    move.l (%a0), %d0
59; CHECK-NEXT:    rts
60entry:
61 %0 = load i32, ptr @d, align 4
62 ret i32 %0
63}
64
65; External Linkage, only declaration, store a value.
66define i32 @my_access_global_store_d() #0 {
67; CHECK-LABEL: my_access_global_store_d:
68; CHECK:         .cfi_startproc
69; CHECK-NEXT:  ; %bb.0: ; %entry
70; CHECK-NEXT:    move.l (d@GOTPCREL,%pc), %a0
71; CHECK-NEXT:    move.l #2, (%a0)
72; CHECK-NEXT:    moveq #0, %d0
73; CHECK-NEXT:    rts
74entry:
75 store i32 2, ptr @d, align 4
76 ret i32 0
77}
78
79; External Linkage, function pointer access.
80declare i32 @access_fp(ptr)
81declare i32 @foo()
82
83define i32 @my_access_fp_foo() #0 {
84; CHECK-LABEL: my_access_fp_foo:
85; CHECK:         .cfi_startproc
86; CHECK-NEXT:  ; %bb.0: ; %entry
87; CHECK-NEXT:    suba.l #4, %sp
88; CHECK-NEXT:    .cfi_def_cfa_offset -8
89; CHECK-NEXT:    move.l (foo@GOTPCREL,%pc), (%sp)
90; CHECK-NEXT:    jsr (access_fp@PLT,%pc)
91; CHECK-NEXT:    adda.l #4, %sp
92; CHECK-NEXT:    rts
93entry:
94 %call = call i32 @access_fp(ptr @foo)
95 ret i32 %call
96}
97
98; LinkOnceODR Linkage, function pointer access.
99
100$bar = comdat any
101
102define linkonce_odr i32 @bar() comdat {
103; CHECK-LABEL: bar:
104; CHECK:         .cfi_startproc
105; CHECK-NEXT:  ; %bb.0: ; %entry
106; CHECK-NEXT:    moveq #0, %d0
107; CHECK-NEXT:    rts
108entry:
109 ret i32 0
110}
111
112define i32 @my_access_fp_bar() #0 {
113; CHECK-LABEL: my_access_fp_bar:
114; CHECK:         .cfi_startproc
115; CHECK-NEXT:  ; %bb.0: ; %entry
116; CHECK-NEXT:    suba.l #4, %sp
117; CHECK-NEXT:    .cfi_def_cfa_offset -8
118; CHECK-NEXT:    move.l (bar@GOTPCREL,%pc), (%sp)
119; CHECK-NEXT:    jsr (access_fp@PLT,%pc)
120; CHECK-NEXT:    adda.l #4, %sp
121; CHECK-NEXT:    rts
122entry:
123 %call = call i32 @access_fp(ptr @bar)
124 ret i32 %call
125}
126
127!llvm.module.flags = !{!0, !1}
128!0 = !{i32 1, !"PIC Level", i32 1}
129!1 = !{i32 1, !"PIE Level", i32 1}
130