Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -emulated-tls -mtriple=i686-linux-android -relocation-model=pic \
      2 ; RUN:     | FileCheck -check-prefix=X86_32 %s
      3 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -march=x86 -relocation-model=pic \
      4 ; RUN:     | FileCheck -check-prefix=X86_32 %s
      5 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -relocation-model=pic \
      6 ; RUN:     | FileCheck -check-prefix=X86_64 %s
      7 ; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic \
      8 ; RUN:     | FileCheck %s
      9 
     10 ; Make sure that TLS symbols are emitted in expected order.
     11 
     12 @external_x = external thread_local global i32, align 8
     13 @external_y = thread_local global i8 7, align 2
     14 @internal_y = internal thread_local global i64 9, align 16
     15 
     16 define i32* @get_external_x() {
     17 entry:
     18   ret i32* @external_x
     19 }
     20 
     21 define i8* @get_external_y() {
     22 entry:
     23   ret i8* @external_y
     24 }
     25 
     26 define i64* @get_internal_y() {
     27 entry:
     28   ret i64* @internal_y
     29 }
     30 
     31 ; CHECK-LABEL: get_external_x:
     32 ; CHECK-NOT:   _tls_get_address
     33 ; CHECK:       __emutls_get_address
     34 ; CHECK-LABEL: get_external_y:
     35 ; CHECK:       __emutls_get_address
     36 ; CHECK-NOT:   _tls_get_address
     37 ; CHECK-LABEL: get_internal_y:
     38 ; CHECK-NOT:   __emutls_t.external_x:
     39 ; CHECK-NOT:   __emutls_v.external_x:
     40 ; CHECK-LABEL: __emutls_v.external_y:
     41 ; CHECK-LABEL: __emutls_t.external_y:
     42 ; CHECK:       __emutls_t.external_y
     43 ; CHECK-LABEL: __emutls_v.internal_y:
     44 ; CHECK-LABEL: __emutls_t.internal_y:
     45 ; CHECK:       __emutls_t.internal_y
     46 
     47 ; X86_32-LABEL:  get_external_x:
     48 ; X86_32:        movl __emutls_v.external_x@GOT(%ebx)
     49 ; X86_32:        calll __emutls_get_address
     50 ; X86_32-LABEL:  get_external_y:
     51 ; X86_32:        movl __emutls_v.external_y@GOT(%ebx)
     52 ; X86_32:        calll __emutls_get_address
     53 ; X86_32-LABEL:  get_internal_y:
     54 ; X86_32:        leal __emutls_v.internal_y@GOTOFF(%ebx)
     55 ; X86_32:        calll __emutls_get_address
     56 ; X86_32-NOT:    __emutls_t.external_x
     57 ; X86_32-NOT:    __emutls_v.external_x:
     58 ; X86_32:        .data{{$}}
     59 ; X86_32:        .globl __emutls_v.external_y
     60 ; X86_32:        .align 4
     61 ; X86_32-LABEL:  __emutls_v.external_y:
     62 ; X86_32-NEXT:   .long 1
     63 ; X86_32-NEXT:   .long 2
     64 ; X86_32-NEXT:   .long 0
     65 ; X86_32-NEXT:   .long __emutls_t.external_y
     66 ; X86_32:        .section .rodata,
     67 ; X86_32-LABEL:  __emutls_t.external_y:
     68 ; X86_32-NEXT:   .byte 7
     69 ; X86_32:        .data{{$}}
     70 ; X86_32-NOT:    .globl
     71 ; X86_32:        .align 4
     72 ; X86_32-LABEL:  __emutls_v.internal_y:
     73 ; X86_32-NEXT:   .long 8
     74 ; X86_32-NEXT:   .long 16
     75 ; X86_32-NEXT:   .long 0
     76 ; X86_32-NEXT:   .long __emutls_t.internal_y
     77 ; X86_32-LABEL:  __emutls_t.internal_y:
     78 ; X86_32-NEXT:   .quad 9
     79 ; X86_64-LABEL:  get_external_x:
     80 ; X86_64:        __emutls_v.external_x@GOTPCREL(%rip)
     81 ; X86_64:        __emutls_get_address
     82 ; X86_64-LABEL:  get_external_y:
     83 ; X86_64:        __emutls_v.external_y@GOTPCREL(%rip)
     84 ; X86_64:        __emutls_get_address
     85 ; X86_64-LABEL:  get_internal_y:
     86 ; X86_64:        __emutls_v.internal_y(%rip)
     87 ; X86_64:        __emutls_get_address
     88 ; X86_64-NOT:    __emutls_t.external_x
     89 ; X86_64-NOT:    __emutls_v.external_x:
     90 ; X86_64:        .globl __emutls_v.external_y
     91 ; X86_64:        .align 8
     92 ; X86_64-LABEL:  __emutls_v.external_y:
     93 ; X86_64-NEXT:   .quad 1
     94 ; X86_64-NEXT:   .quad 2
     95 ; X86_64-NEXT:   .quad 0
     96 ; X86_64-NEXT:   .quad __emutls_t.external_y
     97 ; X86_64-NOT:    __emutls_v.external_x:
     98 ; X86_64:        .section .rodata,
     99 ; X86_64-LABEL:  __emutls_t.external_y:
    100 ; X86_64-NEXT:   .byte 7
    101 ; X86_64:        .data{{$}}
    102 ; X86_64-NOT:    .globl
    103 ; X86_64:        .align 8
    104 ; X86_64-LABEL:  __emutls_v.internal_y:
    105 ; X86_64-NEXT:   .quad 8
    106 ; X86_64-NEXT:   .quad 16
    107 ; X86_64-NEXT:   .quad 0
    108 ; X86_64-NEXT:   .quad __emutls_t.internal_y
    109 ; X86_64:        .section .rodata,
    110 ; X86_64-LABEL:  __emutls_t.internal_y:
    111 ; X86_64-NEXT:   .quad 9
    112