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