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