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