1# REQUIRES: x86
2# RUN: rm -rf %t; split-file %s %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/regular.s -o %t/regular.o
4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/tbss.s -o %t/tbss.o
5
6# RUN: %lld -lSystem -no_pie -o %t/regular %t/regular.o
7# RUN: llvm-otool -hv %t/regular | FileCheck %s --check-prefix=HEADER
8# RUN: llvm-objdump -d --bind --rebase %t/regular | FileCheck %s --check-prefixes=REG,LINKEDIT
9# RUN: llvm-objdump --macho --section=__DATA,__thread_vars %t/regular | \
10# RUN:   FileCheck %s --check-prefix=REG-TLVP
11
12# RUN: %lld -lSystem -pie %t/regular.o -o %t/regular-pie
13# RUN: llvm-otool -hv %t/regular-pie | FileCheck %s --check-prefix=HEADER
14# RUN: llvm-objdump -d --bind --rebase %t/regular-pie | FileCheck %s --check-prefixes=REG,LINKEDIT
15# RUN: llvm-objdump --macho --section=__DATA,__thread_vars %t/regular-pie | \
16# RUN:   FileCheck %s --check-prefix=REG-TLVP
17
18# RUN: %lld -lSystem %t/tbss.o -o %t/tbss -e _f
19# RUN: llvm-objdump -d --bind --rebase %t/tbss | FileCheck %s --check-prefixes=TBSS,LINKEDIT
20# RUN: llvm-objdump --macho --section=__DATA,__thread_vars %t/tbss | \
21# RUN:   FileCheck %s --check-prefix=TBSS-TLVP
22
23# RUN: %lld -lSystem %t/regular.o %t/tbss.o -o %t/regular-and-tbss
24# RUN: llvm-objdump -d --bind --rebase %t/regular-and-tbss | FileCheck %s --check-prefixes=REG,TBSS,LINKEDIT
25# RUN: llvm-objdump --macho --section=__DATA,__thread_vars %t/regular-and-tbss | \
26# RUN:   FileCheck %s --check-prefix=REG-TBSS-TLVP
27# RUN: llvm-objdump --section-headers %t/regular-and-tbss | FileCheck %s --check-prefix=SECTION-ORDER
28
29## Check that we always put __thread_bss immediately after __thread_data,
30## regardless of the order of the input files.
31# RUN: %lld -lSystem %t/tbss.o %t/regular.o -o %t/regular-and-tbss
32# RUN: llvm-objdump --section-headers %t/regular-and-tbss | FileCheck %s --check-prefix=SECTION-ORDER
33
34# HEADER: MH_HAS_TLV_DESCRIPTORS
35
36# REG:       <_main>:
37# REG-NEXT:  leaq    {{.*}}(%rip), %rax  ## {{.*}} <_foo>
38# REG-NEXT:  leaq    {{.*}}(%rip), %rax  ## {{.*}} <_bar>
39# REG-NEXT:  retq
40
41# TBSS:       <_f>:
42# TBSS-NEXT:  leaq    {{.*}}(%rip), %rax  ## {{.*}} <_baz>
43# TBSS-NEXT:  leaq    {{.*}}(%rip), %rax  ## {{.*}} <_qux>
44# TBSS-NEXT:  retq
45
46# REG-TLVP:      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
47# REG-TLVP-NEXT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
48# REG-TLVP-NEXT: 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00
49
50# TBSS-TLVP:      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51# TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
52# TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00
53
54# REG-TBSS-TLVP:      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
55# REG-TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
56# REG-TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00
57# REG-TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
58# REG-TBSS-TLVP-NEXT: 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
59# REG-TBSS-TLVP-NEXT: 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00
60
61## Make sure we don't emit rebase opcodes for relocations in __thread_vars.
62# LINKEDIT:       Rebase table:
63# LINKEDIT-NEXT:  segment  section            address     type
64# LINKEDIT-EMPTY:
65# LINKEDIT-NEXT:  Bind table:
66# LINKEDIT:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
67# LINKEDIT:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
68
69# SECTION-ORDER:      __thread_data
70# SECTION-ORDER:      more_thread_data
71# SECTION-ORDER-NEXT: __thread_bss
72
73#--- regular.s
74.globl _main
75_main:
76  mov _foo@TLVP(%rip), %rax
77  mov _bar@TLVP(%rip), %rax
78  ret
79
80.section __DATA,__thread_data,thread_local_regular
81_foo$tlv$init:
82  .quad 123
83
84.section __DATA,more_thread_data,thread_local_regular
85_bar$tlv$init:
86  .quad 123
87
88.section __DATA,__thread_vars,thread_local_variables
89.globl  _foo, _bar
90_foo:
91  .quad  __tlv_bootstrap
92  .quad  0
93  .quad  _foo$tlv$init
94_bar:
95  .quad  __tlv_bootstrap
96  .quad  0
97  .quad  _bar$tlv$init
98
99#--- tbss.s
100
101.globl _f
102_f:
103  mov _baz@TLVP(%rip), %rax
104  mov _qux@TLVP(%rip), %rax
105  ret
106
107.tbss _baz$tlv$init, 8, 3
108.tbss _qux$tlv$init, 8, 3
109
110.section __DATA,__thread_vars,thread_local_variables
111_baz:
112  .quad  __tlv_bootstrap
113  .quad  0
114  .quad  _baz$tlv$init
115_qux:
116  .quad  __tlv_bootstrap
117  .quad  0
118  .quad  _qux$tlv$init
119