Home | History | Annotate | Download | only in X86
      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