xref: /llvm-project/lld/test/MachO/weak-binding.s (revision 75cdab6dc2453a508157a9c383b93373a93078d6)
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