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