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-readobj --file-headers %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-readobj --file-headers %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-NEXT:  Bind table:
65# LINKEDIT:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
66# LINKEDIT:       __DATA  __thread_vars   0x{{[0-9a-f]*}}  pointer 0 libSystem __tlv_bootstrap
67
68# SECTION-ORDER:      __thread_data
69# SECTION-ORDER:      more_thread_data
70# SECTION-ORDER-NEXT: __thread_bss
71
72#--- regular.s
73.globl _main
74_main:
75  mov _foo@TLVP(%rip), %rax
76  mov _bar@TLVP(%rip), %rax
77  ret
78
79.section	__DATA,__thread_data,thread_local_regular
80_foo$tlv$init:
81  .quad 123
82
83.section	__DATA,more_thread_data,thread_local_regular
84_bar$tlv$init:
85  .quad 123
86
87.section	__DATA,__thread_vars,thread_local_variables
88.globl	_foo, _bar
89_foo:
90  .quad	__tlv_bootstrap
91  .quad	0
92  .quad	_foo$tlv$init
93_bar:
94  .quad	__tlv_bootstrap
95  .quad	0
96  .quad	_bar$tlv$init
97
98#--- tbss.s
99
100.globl _f
101_f:
102  mov _baz@TLVP(%rip), %rax
103  mov _qux@TLVP(%rip), %rax
104  ret
105
106.tbss _baz$tlv$init, 8, 3
107.tbss _qux$tlv$init, 8, 3
108
109.section	__DATA,__thread_vars,thread_local_variables
110_baz:
111  .quad	__tlv_bootstrap
112  .quad	0
113  .quad	_baz$tlv$init
114_qux:
115  .quad	__tlv_bootstrap
116  .quad	0
117  .quad	_qux$tlv$init
118