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