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