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