1cbe27316SJez Ng# REQUIRES: x86 24b896294SGreg McGary# RUN: rm -rf %t; split-file %s %t 3cbe27316SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o 4cbe27316SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o 5643ec67aSJez Ng# RUN: %lld -dylib %t/libfoo.o -o %t/libfoo.dylib 6643ec67aSJez Ng# RUN: %lld %t/test.o -L%t -lfoo -o %t/test -lSystem 7*75cdab6dSDaniel Thornburgh# RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --rebase --bind --lazy-bind --weak-bind \ 80d30e92fSDaniel Bertalan# RUN: --full-contents %t/test | FileCheck --check-prefixes=COMMON,CHECK %s 9cbe27316SJez Ng 100d30e92fSDaniel Bertalan# RUN: %lld -fixup_chains %t/test.o -L%t -lfoo -o %t/chained -lSystem 11*75cdab6dSDaniel Thornburgh# RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --syms --full-contents %t/chained > %t/chained.objdump 12*75cdab6dSDaniel Thornburgh# RUN: llvm-objdump --no-print-imm-hex --macho --dyld-info %t/chained >> %t/chained.objdump 130d30e92fSDaniel Bertalan# RUN: FileCheck %s --check-prefixes=COMMON,CHAINED < %t/chained.objdump 140d30e92fSDaniel Bertalan 150d30e92fSDaniel Bertalan# CHAINED: SYMBOL TABLE: 160d30e92fSDaniel Bertalan# CHAINED: [[#%x,WEAK_INT:]] l F __TEXT,__text _weak_internal{{$}} 170d30e92fSDaniel Bertalan 180d30e92fSDaniel Bertalan# COMMON: Contents of section __DATA_CONST,__got: 19c3e4f3b2SGreg McGary## Check that this section contains a nonzero pointer. It should point to 20c3e4f3b2SGreg McGary## _weak_external_for_gotpcrel. 210d30e92fSDaniel Bertalan# COMMON-NEXT: {{[0-9a-f]+}} {{[0-9a-f ]*[1-9a-f]+[0-9a-f ]*}} 22c3e4f3b2SGreg McGary 2387600483SDaniel Sanders# CHECK: Contents of section __DATA,__la_symbol_ptr: 24e263287cSJez Ng## Check that this section contains a nonzero pointer. It should point to 25e263287cSJez Ng## _weak_external_fn, but we don't have a good way of testing the exact value as 26e263287cSJez Ng## the bytes here are in little-endian order. 27e263287cSJez Ng# CHECK-NEXT: {{[0-9a-f]+}} {{[0-9a-f ]*[1-9a-f]+[0-9a-f ]*}} 28e263287cSJez Ng 290d30e92fSDaniel Bertalan# COMMON-LABEL: <_main>: 300d30e92fSDaniel Bertalan# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_DY_GOT_ADDR:]] 310d30e92fSDaniel Bertalan# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_EXT_GOT_ADDR:]] 320d30e92fSDaniel Bertalan# COMMON-NEXT: leaq [[#]](%rip), %rax ## 0x[[#%X,WEAK_INT_GOT_ADDR:]] 330d30e92fSDaniel Bertalan# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_TLV_ADDR:]] 340d30e92fSDaniel Bertalan# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_DY_TLV_ADDR:]] 350d30e92fSDaniel Bertalan# COMMON-NEXT: leaq [[#]](%rip), %rax ## 0x[[#%X,WEAK_INT_TLV_ADDR:]] 360d30e92fSDaniel Bertalan# COMMON-NEXT: callq 0x{{[0-9a-f]*}} 370d30e92fSDaniel Bertalan# COMMON-NEXT: callq 0x{{[0-9a-f]*}} 380d30e92fSDaniel Bertalan# COMMON-NEXT: callq 0x{{[0-9a-f]*}} 39cbe27316SJez Ng 401f44fee5SFangrui Song# CHECK-LABEL: Rebase table: 411f44fee5SFangrui Song# CHECK: __DATA __la_symbol_ptr 0x[[#%x,WEAK_EXT_FN:]] pointer 421f44fee5SFangrui Song 43cbe27316SJez Ng# CHECK-LABEL: Bind table: 44c3e4f3b2SGreg McGary# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] pointer 0 libfoo _weak_dysym_for_gotpcrel 45c3e4f3b2SGreg McGary# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#%x,WEAK_DY_FN:]] pointer 0 libfoo _weak_dysym_fn 46cbe27316SJez Ng# CHECK-DAG: __DATA __data 0x[[#%x,WEAK_DY:]] pointer 0 libfoo _weak_dysym 47cbe27316SJez Ng# CHECK-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} pointer 0 libSystem __tlv_bootstrap 48fcab06bdSJez Ng# CHECK-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} pointer 0 libSystem __tlv_bootstrap 49cbe27316SJez Ng# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] pointer 0 libfoo _weak_dysym_tlv 50cbe27316SJez Ng## Check that we don't have any other bindings 51fcab06bdSJez Ng# CHECK-EMPTY: 52cbe27316SJez Ng 53e263287cSJez Ng# CHECK-LABEL: Lazy bind table: 54fcab06bdSJez Ng# CHECK-NEXT: segment section address dylib symbol 55e263287cSJez Ng## Verify that we have no lazy bindings 56fcab06bdSJez Ng# CHECK-EMPTY: 57e263287cSJez Ng 58cbe27316SJez Ng# CHECK-LABEL: Weak bind table: 59cbe27316SJez Ng# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] pointer 0 _weak_dysym_for_gotpcrel 60cbe27316SJez Ng# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_EXT_GOT_ADDR]] pointer 0 _weak_external_for_gotpcrel 61cbe27316SJez Ng# CHECK-DAG: __DATA __data 0x[[#WEAK_DY]] pointer 0 _weak_dysym 62cbe27316SJez Ng# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_TLV_ADDR]] pointer 0 _weak_tlv 63cbe27316SJez Ng# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] pointer 0 _weak_dysym_tlv 64cbe27316SJez Ng# CHECK-DAG: __DATA __data 0x{{[0-9a-f]*}} pointer 2 _weak_external 65e263287cSJez Ng# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#WEAK_DY_FN]] pointer 0 _weak_dysym_fn 661f44fee5SFangrui Song# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#WEAK_EXT_FN]] pointer 0 _weak_external_fn 67cbe27316SJez Ng## Check that we don't have any other bindings 68fcab06bdSJez Ng# CHECK-EMPTY: 69cbe27316SJez Ng 70cbe27316SJez Ng## Weak internal symbols don't get bindings 71e263287cSJez Ng# RUN: llvm-objdump --macho --bind --lazy-bind --weak-bind %t/test | FileCheck %s --check-prefix=WEAK-INTERNAL 72cbe27316SJez Ng# WEAK-INTERNAL-NOT: _weak_internal 73e263287cSJez Ng# WEAK-INTERNAL-NOT: _weak_internal_fn 74cbe27316SJez Ng# WEAK-INTERNAL-NOT: _weak_internal_tlv 75cbe27316SJez Ng 760d30e92fSDaniel Bertalan# CHAINED-LABEL: dyld information: 770d30e92fSDaniel Bertalan# CHAINED-NEXT: segment section address pointer type addend dylib symbol/vm address 780d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA_CONST __got 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_external_fn 790d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA_CONST __got 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_dysym_fn 800d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA_CONST __got 0x[[#WEAK_EXT_GOT_ADDR]] {{.*}} bind 0x0 weak _weak_external_for_gotpcrel 810d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] {{.*}} bind 0x0 weak _weak_dysym_for_gotpcrel 820d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_dysym 830d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} bind 0x2 weak _weak_external 840d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} rebase 0x[[#%X,WEAK_INT]] 850d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} {{.*}} bind 0x0 libSystem __tlv_bootstrap 860d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} {{.*}} bind 0x0 libSystem __tlv_bootstrap 870d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] {{.*}} bind 0x0 weak _weak_dysym_tlv 880d30e92fSDaniel Bertalan# CHAINED-DAG: __DATA __thread_ptrs 0x[[#WEAK_TLV_ADDR]] {{.*}} bind 0x0 weak _weak_tlv 890d30e92fSDaniel Bertalan# CHAINED-EMPTY: 900d30e92fSDaniel Bertalan 91cbe27316SJez Ng#--- libfoo.s 92cbe27316SJez Ng 93cbe27316SJez Ng.globl _weak_dysym 94cbe27316SJez Ng.weak_definition _weak_dysym 95cbe27316SJez Ng_weak_dysym: 96cbe27316SJez Ng .quad 0x1234 97cbe27316SJez Ng 98cbe27316SJez Ng.globl _weak_dysym_for_gotpcrel 99cbe27316SJez Ng.weak_definition _weak_dysym_for_gotpcrel 100cbe27316SJez Ng_weak_dysym_for_gotpcrel: 101cbe27316SJez Ng .quad 0x1234 102cbe27316SJez Ng 103e263287cSJez Ng.globl _weak_dysym_fn 104e263287cSJez Ng.weak_definition _weak_dysym_fn 105e263287cSJez Ng_weak_dysym_fn: 106e263287cSJez Ng ret 107e263287cSJez Ng 108cbe27316SJez Ng.section __DATA,__thread_vars,thread_local_variables 109cbe27316SJez Ng 110cbe27316SJez Ng.globl _weak_dysym_tlv 111cbe27316SJez Ng.weak_definition _weak_dysym_tlv 112cbe27316SJez Ng_weak_dysym_tlv: 113cbe27316SJez Ng .quad 0x1234 114cbe27316SJez Ng 115cbe27316SJez Ng#--- test.s 116cbe27316SJez Ng 117e263287cSJez Ng.globl _main, _weak_external, _weak_external_for_gotpcrel, _weak_external_fn 118ccbacddeSJez Ng.weak_definition _weak_external, _weak_external_for_gotpcrel, _weak_external_fn, _weak_internal, _weak_internal_for_gotpcrel, _weak_internal_fn 119cbe27316SJez Ng 120cbe27316SJez Ng_main: 121cbe27316SJez Ng mov _weak_dysym_for_gotpcrel@GOTPCREL(%rip), %rax 122cbe27316SJez Ng mov _weak_external_for_gotpcrel@GOTPCREL(%rip), %rax 123ccbacddeSJez Ng mov _weak_internal_for_gotpcrel@GOTPCREL(%rip), %rax 124cbe27316SJez Ng mov _weak_tlv@TLVP(%rip), %rax 125cbe27316SJez Ng mov _weak_dysym_tlv@TLVP(%rip), %rax 126cbe27316SJez Ng mov _weak_internal_tlv@TLVP(%rip), %rax 127e263287cSJez Ng callq _weak_dysym_fn 128e263287cSJez Ng callq _weak_external_fn 129e263287cSJez Ng callq _weak_internal_fn 130cbe27316SJez Ng mov $0, %rax 131cbe27316SJez Ng ret 132cbe27316SJez Ng 133cbe27316SJez Ng_weak_external: 134cbe27316SJez Ng .quad 0x1234 135cbe27316SJez Ng 136cbe27316SJez Ng_weak_external_for_gotpcrel: 137cbe27316SJez Ng .quad 0x1234 138cbe27316SJez Ng 139e263287cSJez Ng_weak_external_fn: 140e263287cSJez Ng ret 141e263287cSJez Ng 142cbe27316SJez Ng_weak_internal: 143cbe27316SJez Ng .quad 0x1234 144cbe27316SJez Ng 145ccbacddeSJez Ng_weak_internal_for_gotpcrel: 146ccbacddeSJez Ng .quad 0x1234 147ccbacddeSJez Ng 148e263287cSJez Ng_weak_internal_fn: 149e263287cSJez Ng ret 150e263287cSJez Ng 151cbe27316SJez Ng.data 152cbe27316SJez Ng .quad _weak_dysym 153cbe27316SJez Ng .quad _weak_external + 2 154cbe27316SJez Ng .quad _weak_internal 155cbe27316SJez Ng 156cbe27316SJez Ng.tbss _weak_tlv$tlv$init, 4, 2 157cbe27316SJez Ng.tbss _weak_internal_tlv$tlv$init, 4, 2 158cbe27316SJez Ng 159cbe27316SJez Ng.section __DATA,__thread_vars,thread_local_variables 160cbe27316SJez Ng.globl _weak_tlv 161cbe27316SJez Ng.weak_definition _weak_tlv, _weak_internal_tlv 162cbe27316SJez Ng 163cbe27316SJez Ng_weak_tlv: 164cbe27316SJez Ng .quad __tlv_bootstrap 165cbe27316SJez Ng .quad 0 166cbe27316SJez Ng .quad _weak_tlv$tlv$init 167cbe27316SJez Ng 168cbe27316SJez Ng_weak_internal_tlv: 169cbe27316SJez Ng .quad __tlv_bootstrap 170cbe27316SJez Ng .quad 0 171cbe27316SJez Ng .quad _weak_internal_tlv$tlv$init 172