Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / lld / test / MachO / weak-reference.s
blobff72cc3d505fbd63c06b4501f6051aa05954d729
1 # REQUIRES: x86
2 # RUN: rm -rf %t; split-file %s %t
3 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o
4 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/strongref.s -o %t/strongref.o
5 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
6 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/invalid.s -o %t/invalid.o
7 # RUN: %lld -lSystem -dylib %t/libfoo.o -o %t/libfoo.dylib
9 # RUN: %lld -lSystem %t/test.o %t/libfoo.dylib -o %t/test
10 # RUN: %lld -fixup_chains -lSystem %t/test.o %t/libfoo.dylib -o %t/chained
11 # RUN: llvm-objdump --macho --syms --bind --lazy-bind %t/test | FileCheck %s --check-prefixes=SYMS,BIND
12 # RUN: llvm-objdump --macho --syms --dyld-info %t/chained | FileCheck %s --check-prefixes=CHAINED
13 ## llvm-objdump doesn't print out all the flags info for lazy & weak bindings,
14 ## so we use obj2yaml instead to test them.
15 # RUN: obj2yaml %t/test | FileCheck %s --check-prefix=YAML
17 # RUN: %lld -lSystem %t/libfoo.dylib %t/test.o -o %t/test
18 # RUN: llvm-objdump --macho --syms --bind --lazy-bind %t/test | FileCheck %s --check-prefixes=SYMS,BIND
19 # RUN: obj2yaml %t/test | FileCheck %s --check-prefix=YAML
21 # SYMS: SYMBOL TABLE:
22 # SYMS-DAG: 0000000000000000 w *UND* _foo
23 # SYMS-DAG: 0000000000000000 w *UND* _foo_fn
24 # SYMS-DAG: 0000000000000000 w *UND* _foo_tlv
25 # SYMS-DAG: 0000000000000000 w *UND* _weak_foo
26 # SYMS-DAG: 0000000000000000 w *UND* _weak_foo_fn
28 # BIND: Bind table:
29 # BIND-NEXT: segment section address type addend dylib symbol
30 # BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _foo (weak_import)
31 # BIND-DAG: __DATA_CONST __got 0x{{[0-9a-f]+}} pointer 0 libfoo _foo (weak_import)
32 # BIND-DAG: __DATA __thread_ptrs 0x{{[0-9a-f]+}} pointer 0 libfoo _foo_tlv (weak_import)
33 # BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _weak_foo (weak_import)
34 # BIND-DAG: __DATA __la_symbol_ptr 0x{{[0-9a-f]+}} pointer 0 libfoo _weak_foo_fn (weak_import)
35 # BIND: Lazy bind table:
36 # BIND-NEXT: segment section address dylib symbol
37 # BIND-DAG: __DATA __la_symbol_ptr 0x{{[0-9a-f]+}} libfoo _foo_fn
39 # CHAINED: dyld information:
40 # CHAINED-NEXT: segment section address pointer type addend dylib symbol/vm address
41 # CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 libfoo _foo (weak import)
42 # CHAINED-DAG: __DATA __data {{.*}} bind 0x0 libfoo _foo (weak import)
43 # CHAINED-DAG: __DATA __thread_ptrs {{.*}} bind 0x0 libfoo _foo_tlv (weak import)
44 # CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 libfoo _foo_fn (weak import)
45 # CHAINED-DAG: __DATA __data {{.*}} bind 0x0 weak _weak_foo (weak import)
46 # CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 weak _weak_foo_fn (weak import)
48 # YAML-LABEL: WeakBindOpcodes:
49 # YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
50 # YAML-NEXT: Imm: 0
51 # YAML-NEXT: Symbol: _weak_foo_fn
52 # YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
53 # YAML-NEXT: Imm: 0
54 # YAML-NEXT: Symbol: _weak_foo
55 # YAML-LABEL: LazyBindOpcodes:
56 # YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
57 # YAML-NEXT: Imm: 1
58 # YAML-NEXT: Symbol: _foo_fn
60 ## Check that if both strong & weak references are present in inputs, the weak
61 ## reference takes priority. NOTE: ld64 actually emits a strong reference if
62 ## the reference is to a function symbol or a TLV. I'm not sure if there's a
63 ## good reason for that, so I'm deviating here for a simpler implementation.
64 # RUN: %lld -lSystem %t/test.o %t/strongref.o %t/libfoo.dylib -o %t/with-strong
65 # RUN: %lld -fixup_chains -lSystem %t/test.o %t/strongref.o %t/libfoo.dylib -o %t/with-strong-chained
66 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
67 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
68 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
69 # RUN: %lld -lSystem %t/strongref.o %t/test.o %t/libfoo.dylib -o %t/with-strong
70 # RUN: %lld -fixup_chains -lSystem %t/strongref.o %t/test.o %t/libfoo.dylib -o %t/with-strong-chained
71 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
72 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
73 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
74 # RUN: %lld -lSystem %t/libfoo.dylib %t/strongref.o %t/test.o -o %t/with-strong
75 # RUN: %lld -fixup_chains -lSystem %t/libfoo.dylib %t/strongref.o %t/test.o -o %t/with-strong-chained
76 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
77 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
78 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
79 # RUN: %lld -lSystem %t/libfoo.dylib %t/test.o %t/strongref.o -o %t/with-strong
80 # RUN: %lld -fixup_chains -lSystem %t/libfoo.dylib %t/test.o %t/strongref.o -o %t/with-strong-chained
81 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
82 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
83 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
84 # RUN: %lld -lSystem %t/test.o %t/libfoo.dylib %t/strongref.o -o %t/with-strong
85 # RUN: %lld -fixup_chains -lSystem %t/test.o %t/libfoo.dylib %t/strongref.o -o %t/with-strong-chained
86 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
87 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
88 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
89 # RUN: %lld -lSystem %t/strongref.o %t/libfoo.dylib %t/test.o -o %t/with-strong
90 # RUN: %lld -fixup_chains -lSystem %t/strongref.o %t/libfoo.dylib %t/test.o -o %t/with-strong-chained
91 # RUN: llvm-objdump --macho --bind %t/with-strong | FileCheck %s --check-prefix=STRONG-BIND
92 # RUN: llvm-objdump --macho --dyld-info %t/with-strong-chained | FileCheck %s --check-prefix=STRONG-CHAINED
93 # RUN: obj2yaml %t/with-strong | FileCheck %s --check-prefix=STRONG-YAML
95 # STRONG-BIND: Bind table:
96 # STRONG-BIND-NEXT: segment section address type addend dylib symbol
97 # STRONG-BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _foo{{$}}
98 # STRONG-BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _foo{{$}}
99 # STRONG-BIND-DAG: __DATA_CONST __got 0x{{[0-9a-f]+}} pointer 0 libfoo _foo{{$}}
100 # STRONG-BIND-DAG: __DATA __thread_ptrs 0x{{[0-9a-f]+}} pointer 0 libfoo _foo_tlv{{$}}
101 # STRONG-BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _weak_foo{{$}}
102 # STRONG-BIND-DAG: __DATA __data 0x{{[0-9a-f]+}} pointer 0 libfoo _weak_foo{{$}}
103 # STRONG-BIND-DAG: __DATA __la_symbol_ptr 0x{{[0-9a-f]+}} pointer 0 libfoo _weak_foo_fn{{$}}
105 # STRONG-CHAINED: dyld information:
106 # STRONG-CHAINED-NEXT: segment section address pointer type addend dylib symbol/vm address
107 # STRONG-CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 weak _weak_foo_fn{{$}}
108 # STRONG-CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 libfoo _foo_fn{{$}}
109 # STRONG-CHAINED-DAG: __DATA_CONST __got {{.*}} bind 0x0 libfoo _foo{{$}}
110 # STRONG-CHAINED-DAG: __DATA __data {{.*}} bind 0x0 libfoo _foo{{$}}
111 # STRONG-CHAINED-DAG: __DATA __data {{.*}} bind 0x0 libfoo _foo{{$}}
112 # STRONG-CHAINED-DAG: __DATA __data {{.*}} bind 0x0 weak _weak_foo{{$}}
113 # STRONG-CHAINED-DAG: __DATA __data {{.*}} bind 0x0 weak _weak_foo{{$}}
114 # STRONG-CHAINED-DAG: __DATA __thread_ptrs {{.*}} bind 0x0 libfoo _foo_tlv{{$}}
116 # STRONG-YAML-LABEL: WeakBindOpcodes:
117 # STRONG-YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
118 # STRONG-YAML-NEXT: Imm: 0
119 # STRONG-YAML-NEXT: Symbol: _weak_foo_fn
120 # STRONG-YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
121 # STRONG-YAML-NEXT: Imm: 0
122 # STRONG-YAML-NEXT: Symbol: _weak_foo
123 # STRONG-YAML-LABEL: LazyBindOpcodes:
124 # STRONG-YAML: - Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
125 # STRONG-YAML-NEXT: Imm: 0
126 # STRONG-YAML-NEXT: Symbol: _foo_fn
128 ## Weak references must still be satisfied at link time.
129 # RUN: not %lld -lSystem %t/invalid.o -o /dev/null 2>&1 | FileCheck %s \
130 # RUN: --check-prefix=INVALID -DDIR=%t
131 # INVALID: error: undefined symbol: _missing
133 #--- libfoo.s
134 .globl _foo, _foo_fn, _weak_foo, _weak_foo_fn
135 .weak_definition _weak_foo, _weak_foo_fn
136 _foo:
137 _foo_fn:
138 _weak_foo:
139 _weak_foo_fn:
141 .section __DATA,__thread_vars,thread_local_variables
142 .globl _foo_tlv
143 _foo_tlv:
145 #--- test.s
146 .globl _main
147 .weak_reference _foo_fn, _foo, _weak_foo, _weak_foo_fn, _foo_tlv
149 _main:
150 mov _foo@GOTPCREL(%rip), %rax
151 mov _foo_tlv@TLVP(%rip), %rax
152 callq _foo_fn
153 callq _weak_foo_fn
156 .data
157 .quad _foo
158 .quad _weak_foo
160 #--- strongref.s
161 .globl _strongref
162 _strongref:
163 mov _foo@GOTPCREL(%rip), %rax
164 mov _foo_tlv@TLVP(%rip), %rax
165 callq _foo_fn
166 callq _weak_foo_fn
169 .data
170 .quad _foo
171 .quad _weak_foo
173 #--- invalid.s
174 .globl _main
175 .weak_reference _missing
176 _main:
177 callq _missing