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