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=medium -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: lea (_GLOBAL_OFFSET_TABLE_@GOTPCREL,%pc), %a0 44; CHECK-NEXT: move.l #c@GOTOFF, %d0 45; CHECK-NEXT: move.l (0,%a0,%d0), %d0 46; CHECK-NEXT: rts 47entry: 48 %0 = load i32, ptr @c, align 4 49 ret i32 %0 50} 51 52; External Linkage, only declaration. 53@d = external global i32, align 4 54 55define i32 @my_access_global_load_d() #0 { 56; CHECK-LABEL: my_access_global_load_d: 57; CHECK: .cfi_startproc 58; CHECK-NEXT: ; %bb.0: ; %entry 59; CHECK-NEXT: move.l (d@GOTPCREL,%pc), %a0 60; CHECK-NEXT: move.l (%a0), %d0 61; CHECK-NEXT: rts 62entry: 63 %0 = load i32, ptr @d, align 4 64 ret i32 %0 65} 66 67; External Linkage, only declaration, store a value. 68define i32 @my_access_global_store_d() #0 { 69; CHECK-LABEL: my_access_global_store_d: 70; CHECK: .cfi_startproc 71; CHECK-NEXT: ; %bb.0: ; %entry 72; CHECK-NEXT: move.l (d@GOTPCREL,%pc), %a0 73; CHECK-NEXT: move.l #2, (%a0) 74; CHECK-NEXT: moveq #0, %d0 75; CHECK-NEXT: rts 76entry: 77 store i32 2, ptr @d, align 4 78 ret i32 0 79} 80 81; External Linkage, function pointer access. 82declare i32 @access_fp(ptr) 83declare i32 @foo() 84 85define i32 @my_access_fp_foo() #0 { 86; CHECK-LABEL: my_access_fp_foo: 87; CHECK: .cfi_startproc 88; CHECK-NEXT: ; %bb.0: ; %entry 89; CHECK-NEXT: suba.l #4, %sp 90; CHECK-NEXT: .cfi_def_cfa_offset -8 91; CHECK-NEXT: move.l (foo@GOTPCREL,%pc), (%sp) 92; CHECK-NEXT: jsr (access_fp@PLT,%pc) 93; CHECK-NEXT: adda.l #4, %sp 94; CHECK-NEXT: rts 95entry: 96 %call = call i32 @access_fp(ptr @foo) 97 ret i32 %call 98} 99 100; LinkOnceODR Linkage, function pointer access. 101 102$bar = comdat any 103 104define linkonce_odr i32 @bar() comdat { 105; CHECK-LABEL: bar: 106; CHECK: .cfi_startproc 107; CHECK-NEXT: ; %bb.0: ; %entry 108; CHECK-NEXT: moveq #0, %d0 109; CHECK-NEXT: rts 110entry: 111 ret i32 0 112} 113 114define i32 @my_access_fp_bar() #0 { 115; CHECK-LABEL: my_access_fp_bar: 116; CHECK: .cfi_startproc 117; CHECK-NEXT: ; %bb.0: ; %entry 118; CHECK-NEXT: suba.l #4, %sp 119; CHECK-NEXT: .cfi_def_cfa_offset -8 120; CHECK-NEXT: move.l (bar@GOTPCREL,%pc), (%sp) 121; CHECK-NEXT: jsr (access_fp@PLT,%pc) 122; CHECK-NEXT: adda.l #4, %sp 123; CHECK-NEXT: rts 124entry: 125 %call = call i32 @access_fp(ptr @bar) 126 ret i32 %call 127} 128 129!llvm.module.flags = !{!0, !1} 130!0 = !{i32 1, !"PIC Level", i32 1} 131!1 = !{i32 1, !"PIE Level", i32 1} 132