1; RUN: llc -mtriple=arm-linux-gnueabi < %s \
2; RUN:     | FileCheck -check-prefix=CHECK-NONPIC -check-prefix=COMMON %s
3; RUN: llc -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \
4; RUN:     | FileCheck -check-prefix=CHECK-PIC  -check-prefix=COMMON %s
5; RUN: llc -emulated-tls -mtriple=arm-linux-gnueabi < %s \
6; RUN:     | FileCheck -check-prefix=EMUNONPIC -check-prefix=EMU -check-prefix=COMMON %s
7; RUN: llc -emulated-tls -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \
8; RUN:     | FileCheck -check-prefix=EMUPIC -check-prefix=EMU -check-prefix=COMMON %s
9
10
11@external_gd = external thread_local global i32
12@internal_gd = internal thread_local global i32 42
13
14@external_ld = external thread_local(localdynamic) global i32
15@internal_ld = internal thread_local(localdynamic) global i32 42
16
17@external_ie = external thread_local(initialexec) global i32
18@internal_ie = internal thread_local(initialexec) global i32 42
19
20@external_le = external thread_local(localexec) global i32
21@internal_le = internal thread_local(localexec) global i32 42
22
23; ----- no model specified -----
24
25define i32* @f1() {
26entry:
27  ret i32* @external_gd
28
29  ; COMMON-LABEL:   f1:
30  ; Non-PIC code can use initial-exec, PIC code has to use general dynamic.
31  ; CHECK-NONPIC:   external_gd(GOTTPOFF)
32  ; CHECK-PIC:      external_gd(TLSGD)
33  ; EMU:            __emutls_get_address
34}
35
36define i32* @f2() {
37entry:
38  ret i32* @internal_gd
39
40  ; COMMON-LABEL:   f2:
41  ; Non-PIC code can use local exec, PIC code can use local dynamic,
42  ; but that is not implemented, so falls back to general dynamic.
43  ; CHECK-NONPIC:   internal_gd(TPOFF)
44  ; CHECK-PIC:      internal_gd(TLSGD)
45  ; EMU:            __emutls_get_address
46}
47
48
49; ----- localdynamic specified -----
50
51define i32* @f3() {
52entry:
53  ret i32* @external_ld
54
55  ; COMMON-LABEL:   f3:
56  ; Non-PIC code can use initial exec, PIC should use local dynamic,
57  ; but that is not implemented, so falls back to general dynamic.
58  ; CHECK-NONPIC:   external_ld(GOTTPOFF)
59  ; CHECK-PIC:      external_ld(TLSGD)
60  ; EMU:            __emutls_get_address
61}
62
63define i32* @f4() {
64entry:
65  ret i32* @internal_ld
66
67  ; COMMON-LABEL:   f4:
68  ; Non-PIC code can use local exec, PIC code can use local dynamic,
69  ; but that is not implemented, so it falls back to general dynamic.
70  ; CHECK-NONPIC:   internal_ld(TPOFF)
71  ; CHECK-PIC:      internal_ld(TLSGD)
72  ; EMU:            __emutls_get_address
73}
74
75
76; ----- initialexec specified -----
77
78define i32* @f5() {
79entry:
80  ret i32* @external_ie
81
82  ; COMMON-LABEL:   f5:
83  ; Non-PIC and PIC code will use initial exec as specified.
84  ; CHECK-NONPIC:   external_ie(GOTTPOFF)
85  ; CHECK-PIC:      external_ie(GOTTPOFF)
86  ; EMU:            __emutls_get_address
87}
88
89define i32* @f6() {
90entry:
91  ret i32* @internal_ie
92
93  ; COMMON-LABEL:   f6:
94  ; Non-PIC code can use local exec, PIC code use initial exec as specified.
95  ; CHECK-NONPIC:   internal_ie(TPOFF)
96  ; CHECK-PIC:      internal_ie(GOTTPOFF)
97  ; EMU:            __emutls_get_address
98}
99
100
101; ----- localexec specified -----
102
103define i32* @f7() {
104entry:
105  ret i32* @external_le
106
107  ; COMMON-LABEL:   f7:
108  ; Non-PIC and PIC code will use local exec as specified.
109  ; CHECK-NONPIC:   external_le(TPOFF)
110  ; CHECK-PIC:      external_le(TPOFF)
111  ; EMU:            __emutls_get_address
112}
113
114define i32* @f8() {
115entry:
116  ret i32* @internal_le
117
118  ; COMMON-LABEL:   f8:
119  ; Non-PIC and PIC code will use local exec as specified.
120  ; CHECK-NONPIC:   internal_le(TPOFF)
121  ; CHECK-PIC:      internal_le(TPOFF)
122  ; EMU:            __emutls_get_address
123}
124
125
126; ----- emulated specified -----
127
128; External declaration has no initializer.
129; Internal definition has initializer.
130
131; EMU-NOT:   __emutls_t.external_gd
132; EMU-NOT:   __emutls_v.external_gd
133; EMU:       .p2align 2
134; EMU-LABEL: __emutls_v.internal_gd:
135; EMU-NEXT:  .long 4
136; EMU-NEXT:  .long 4
137; EMU-NEXT:  .long 0
138; EMU-NEXT:  .long __emutls_t.internal_gd
139; EMU-LABEL: __emutls_t.internal_gd:
140; EMU-NEXT:  .long 42
141; EMU-NOT:   __emutls_t.external_gd
142
143; __emutls_t and __emutls_v are the same for PIC and non-PIC modes.
144
145; EMU-NOT:   __emutls_t.external_gd
146; EMU-NOT:   __emutls_v.external_gd
147; EMU:       .p2align 2
148; EMU-LABEL: __emutls_v.internal_le:
149; EMU-NEXT:  .long 4
150; EMU-NEXT:  .long 4
151; EMU-NEXT:  .long 0
152; EMU-NEXT:  .long __emutls_t.internal_le
153; EMU-LABEL: __emutls_t.internal_le:
154; EMU-NEXT:  .long 42
155; EMU-NOT:   __emutls_t.external_le
156