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