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