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
27define i32* @get_external_x() {
28entry:
29  ret i32* @external_x
30}
31
32define i8* @get_external_y() {
33entry:
34  ret i8* @external_y
35}
36
37define i64* @get_internal_y() {
38entry:
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