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