1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \ 2*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=X64 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \ 4*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=X32 %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; External Linkage 7*9880d681SAndroid Build Coastguard Worker@a = global i32 0, align 4 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_global_a() #0 { 10*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_global_a: 11*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax 12*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl a@GOTOFF(%eax), %eax 13*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_global_a: 14*9880d681SAndroid Build Coastguard Worker; X64: movl a(%rip), %eax 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @a, align 4 18*9880d681SAndroid Build Coastguard Worker ret i32 %0 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; WeakAny Linkage 22*9880d681SAndroid Build Coastguard Worker@b = weak global i32 0, align 4 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_global_b() #0 { 25*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_global_b: 26*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax 27*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl b@GOTOFF(%eax), %eax 28*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_global_b: 29*9880d681SAndroid Build Coastguard Worker; X64: movl b(%rip), %eax 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @b, align 4 33*9880d681SAndroid Build Coastguard Worker ret i32 %0 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Internal Linkage 37*9880d681SAndroid Build Coastguard Worker@c = internal global i32 0, align 4 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_global_c() #0 { 40*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_global_c: 41*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax 42*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl c@GOTOFF(%eax), %eax 43*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_global_c: 44*9880d681SAndroid Build Coastguard Worker; X64: movl c(%rip), %eax 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @c, align 4 48*9880d681SAndroid Build Coastguard Worker ret i32 %0 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; External Linkage, only declaration. 52*9880d681SAndroid Build Coastguard Worker@d = external global i32, align 4 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_global_load_d() #0 { 55*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_global_load_d: 56*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax 57*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl d@GOT(%eax), %eax 58*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl (%eax), %eax 59*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_global_load_d: 60*9880d681SAndroid Build Coastguard Worker; X64: movq d@GOTPCREL(%rip), %rax 61*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl (%rax), %eax 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerentry: 64*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @d, align 4 65*9880d681SAndroid Build Coastguard Worker ret i32 %0 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; External Linkage, only declaration, store a value. 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_global_store_d() #0 { 71*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_global_store_d: 72*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax 73*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl d@GOT(%eax), %eax 74*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl $2, (%eax) 75*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_global_store_d: 76*9880d681SAndroid Build Coastguard Worker; X64: movq d@GOTPCREL(%rip), %rax 77*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl $2, (%rax) 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker store i32 2, i32* @d, align 4 81*9880d681SAndroid Build Coastguard Worker ret i32 0 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; External Linkage, function pointer access. 85*9880d681SAndroid Build Coastguard Workerdeclare i32 @access_fp(i32 ()*) 86*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo() 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_fp_foo() #0 { 89*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_fp_foo: 90*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %ebx 91*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl foo@GOT(%ebx), %eax 92*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_fp_foo: 93*9880d681SAndroid Build Coastguard Worker; X64: movq foo@GOTPCREL(%rip), %rdi 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerentry: 96*9880d681SAndroid Build Coastguard Worker %call = call i32 @access_fp(i32 ()* @foo) 97*9880d681SAndroid Build Coastguard Worker ret i32 %call 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; LinkOnceODR Linkage, function pointer access. 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker$bar = comdat any 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr i32 @bar() comdat { 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker ret i32 0 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine i32 @my_access_fp_bar() #0 { 110*9880d681SAndroid Build Coastguard Worker; X32-LABEL: my_access_fp_bar: 111*9880d681SAndroid Build Coastguard Worker; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %ebx 112*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal bar@GOTOFF(%ebx), %eax 113*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_access_fp_bar: 114*9880d681SAndroid Build Coastguard Worker; X64: leaq bar(%rip), %rdi 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerentry: 117*9880d681SAndroid Build Coastguard Worker %call = call i32 @access_fp(i32 ()* @bar) 118*9880d681SAndroid Build Coastguard Worker ret i32 %call 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker!llvm.module.flags = !{!0, !1} 122*9880d681SAndroid Build Coastguard Worker!0 = !{i32 1, !"PIC Level", i32 1} 123*9880d681SAndroid Build Coastguard Worker!1 = !{i32 1, !"PIE Level", i32 1} 124