Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / lld / test / MachO / weak-definition-gc.s
bloba10f0f4792722a51a2c0e1013bcd967a12fac7b6
1 # REQUIRES: x86
2 # RUN: rm -rf %t; split-file %s %t
4 ## This tests that if two input files define the same weak symbol, we only
5 ## write it to the output once (...assuming both input files use
6 ## .subsections_via_symbols).
8 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-sub.s -o %t/weak-sub.o
9 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-nosub.s -o %t/weak-nosub.o
11 ## Test that weak symbols are emitted just once with .subsections_via_symbols
12 # RUN: %lld -dylib -o %t/out.dylib %t/weak-sub.o %t/weak-sub.o
13 # RUN: llvm-otool -jtV %t/out.dylib | FileCheck --check-prefix=SUB %s
14 # RUN: %lld -dylib -o %t/out.dylib %t/weak-nosub.o %t/weak-sub.o
15 # RUN: llvm-otool -jtV %t/out.dylib | FileCheck --check-prefix=SUB %s
16 # RUN: %lld -dylib -o %t/out.dylib %t/weak-sub.o %t/weak-nosub.o
17 # RUN: llvm-otool -jtV %t/out.dylib | FileCheck --check-prefix=SUB %s
18 # SUB: _foo
19 # SUB-NEXT: retq
20 # SUB-NOT: retq
21 # SUB: _bar
22 # SUB-NEXT: retq
23 # SUB-NOT: retq
25 ## We can even strip weak symbols without subsections_via_symbols as long
26 ## as none of the weak symbols in a section are needed.
27 # RUN: %lld -dylib -o %t/out.dylib %t/weak-nosub.o %t/weak-nosub.o
28 # RUN: llvm-otool -jtV %t/out.dylib | FileCheck --check-prefix=SUB %s
30 ## Test that omitted weak symbols don't add entries to the compact unwind table.
31 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-sub-lsda.s -o %t/weak-sub-lsda.o
32 # RUN: %lld -dylib -lc++ -o %t/out.dylib %t/weak-sub-lsda.o %t/weak-sub-lsda.o
33 # RUN: llvm-objdump --macho --unwind-info --syms %t/out.dylib | FileCheck %s --check-prefix=ONE-UNWIND
34 # RUN: %lld -dylib -lc++ -o %t/out.dylib %t/weak-sub.o %t/weak-sub-lsda.o
35 # RUN: llvm-objdump --macho --unwind-info --syms %t/out.dylib | FileCheck %s --check-prefix=NO-UNWIND
36 # RUN: yaml2obj %t/weak-sub-lsda-r.yaml -o %t/weak-sub-lsda-r.o
37 # RUN: %lld -dylib -lc++ -o %t/out.dylib %t/weak-sub.o %t/weak-sub-lsda-r.o
38 # RUN: llvm-objdump --macho --unwind-info --syms %t/out.dylib | FileCheck %s --check-prefix=NO-UNWIND
40 # ONE-UNWIND: SYMBOL TABLE:
41 # ONE-UNWIND-DAG: [[#%x,FOO:]] w F __TEXT,__text _foo
42 # ONE-UNWIND-NOT: __TEXT,__text _foo
44 # ONE-UNWIND: Contents of __unwind_info section:
45 # ONE-UNWIND: LSDA descriptors:
46 # ONE-UNWIND: [0]: function offset=0x[[#%.8x,FOO]]
47 # ONE-UNWIND-NOT: [1]:
48 # ONE-UNWIND: Second level indices:
49 # ONE-UNWIND-DAG: [0]: function offset=0x[[#%.8x,FOO]]
50 # ONE-UNWIND-NOT: [1]:
52 # NO-UNWIND: SYMBOL TABLE:
53 # NO-UNWIND-DAG: [[#%x,FOO:]] w F __TEXT,__text _foo
54 # NO-UNWIND-NOT: __TEXT,__text _foo
55 # NO-UNWIND-NOT: Contents of __unwind_info section:
57 ## Test interaction with .alt_entry
58 ## FIXME: ld64 manages to strip both one copy of _foo and _bar each.
59 ## We only manage this if we're lucky and the object files are in
60 ## the right order. We're happy to not crash at link time for now.
61 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-sub-alt.s -o %t/weak-sub-alt.o
62 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-sub-alt2.s -o %t/weak-sub-alt2.o
63 # RUN: %lld -dylib -o %t/out.dylib %t/weak-sub-alt.o %t/weak-sub-alt2.o
64 # RUN: %lld -dylib -o %t/out.dylib %t/weak-sub-alt2.o %t/weak-sub-alt.o
66 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-aligned-1.s -o %t/weak-aligned-1.o
67 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-aligned-2.s -o %t/weak-aligned-2.o
68 # RUN: %lld -o %t/out -lSystem %t/weak-aligned-1.o %t/weak-aligned-2.o
69 # RUN: llvm-objdump --syms --section=__const --full-contents %t/out | FileCheck --check-prefixes=ALIGN,ALIGN2 %s
70 # RUN: %lld -o %t/out -lSystem %t/weak-aligned-1.o %t/weak-aligned-2.o -dead_strip
71 # RUN: llvm-objdump --syms --section=__const --full-contents %t/out | FileCheck --check-prefixes=ALIGN,ALIGN3 %s
72 # ALIGN: SYMBOL TABLE:
73 # ALIGN-DAG: [[#%x, ADDR:]] l O __DATA_CONST,__const .hidden _weak1
74 # ALIGN2-DAG: {{0*}}[[#ADDR+ 0x4]] l O __DATA_CONST,__const .hidden _weak3
75 # ALIGN3-DAG: {{0*}}[[#ADDR+ 0x4]] l O __DATA_CONST,__const .hidden _weak2
76 # ALIGN2-DAG: {{0*}}[[#ADDR+ 0x8]] l O __DATA_CONST,__const .hidden _weak2
77 # ALIGN-DAG: {{0*}}[[#ADDR+0x10]] g O __DATA_CONST,__const _aligned
78 # ALIGN: Contents of section __DATA_CONST,__const:
79 # ALIGN2-NEXT: {{0*}}[[#ADDR]] 11111111 33333333 22222222 00000000
80 # ALIGN3-NEXT: {{0*}}[[#ADDR]] 11111111 22222222 00000000 00000000
81 # ALIGN-NEXT: {{0*}}[[#ADDR+0x10]] 81818181 81818181 82828282 82828282
83 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/weak-def.s -o %t/weak-def.o
84 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/strong-def.s -o %t/strong-def.o
85 # RUN: %lld -dylib -lc++ -o %t/weak-strong-mixed.dylib %t/weak-def.o %t/strong-def.o
86 # RUN: %lld -dylib -lc++ -o %t/strong-weak-mixed.dylib %t/strong-def.o %t/weak-def.o
87 ## Check that omitted weak symbols are not adding their section and unwind stuff.
89 # RUN: llvm-otool -jtV %t/weak-strong-mixed.dylib | FileCheck --check-prefix=MIXED %s
90 # RUN: llvm-otool -jtV %t/strong-weak-mixed.dylib | FileCheck --check-prefix=MIXED %s
91 # MIXED: (__TEXT,__text) section
92 # MIXED-NEXT: _foo:
93 # MIXED-NEXT: {{.+}} 33 33 xorl (%rbx), %esi
94 # MIXED-NEXT: {{.+}} 33 33 xorl (%rbx), %esi
95 # MIXED-NEXT: {{.+}} c3 retq
97 # RUN: llvm-objdump --macho --syms --unwind-info %t/weak-strong-mixed.dylib | FileCheck --check-prefix=MIXED-UNWIND %s
98 # RUN: llvm-objdump --macho --syms --unwind-info %t/strong-weak-mixed.dylib | FileCheck --check-prefix=MIXED-UNWIND %s
99 # MIXED-UNWIND: g F __TEXT,__text _foo
100 # MIXED-UNWIND-NOT: Contents of __unwind_info section:
102 #--- weak-sub.s
103 .globl _foo, _bar
104 .weak_definition _foo, _bar
105 _foo:
106 retq
107 _bar:
108 retq
109 .subsections_via_symbols
111 #--- weak-nosub.s
112 .globl _foo, _bar
113 .weak_definition _foo, _bar
114 _foo:
115 retq
116 _bar:
117 retq
119 #--- weak-sub-lsda.s
120 .section __TEXT,__text,regular,pure_instructions
122 .globl _foo
123 .weak_definition _foo
124 _foo:
125 .cfi_startproc
126 .cfi_personality 155, ___gxx_personality_v0
127 .cfi_lsda 16, Lexception
128 pushq %rbp
129 .cfi_def_cfa_offset 128
130 .cfi_offset %rbp, 48
131 movq %rsp, %rbp
132 .cfi_def_cfa_register %rbp
133 popq %rbp
134 retq
135 .cfi_endproc
137 .section __TEXT,__gcc_except_tab
138 Lexception:
139 .space 0x10
141 .subsections_via_symbols
143 #--- weak-sub-alt.s
144 .globl _foo, _bar
145 .weak_definition _foo
146 _foo:
147 retq
149 # Alternative entry point to _foo (strong)
150 .alt_entry _bar
151 _bar:
152 retq
154 .globl _main, _ref
155 _main:
156 callq _ref
157 callq _bar
159 .subsections_via_symbols
161 #--- weak-sub-alt2.s
162 .globl _foo, _bar
163 .weak_definition _foo
164 _foo:
165 retq
167 # Alternative entry point to _foo (weak)
168 .weak_definition _bar
169 .alt_entry _bar
170 _bar:
171 retq
173 .globl _ref
174 _ref:
175 callq _bar
177 .subsections_via_symbols
179 #--- weak-aligned-1.s
180 .section __DATA,__const
181 .p2align 3
182 .globl _weak1
183 .weak_def_can_be_hidden _weak1
184 _weak1:
185 .4byte 0x11111111
187 .globl _weak3
188 .weak_def_can_be_hidden _weak3
189 _weak3:
190 .4byte 0x33333333
192 .subsections_via_symbols
194 #--- weak-aligned-2.s
195 # _weak1 and _weak3 are already in weak-aligned-1,
196 # so from _weak1-3 in this file only _weak2 is used.
197 # However, _aligned still has to stay aligned to a 16-byte boundary.
198 .section __DATA,__const
199 .p2align 3
200 .globl _weak1
201 .weak_def_can_be_hidden _weak1
202 _weak1:
203 .4byte 0x11111111
205 .globl _weak2
206 .weak_def_can_be_hidden _weak2
207 _weak2:
208 .4byte 0x22222222
210 .globl _weak3
211 .weak_def_can_be_hidden _weak3
212 _weak3:
213 .4byte 0x33333333
215 .section __DATA,__const
216 .p2align 4
217 .globl _aligned
218 _aligned:
219 .8byte 0x8181818181818181
220 .8byte 0x8282828282828282
222 .section __TEXT,__text
223 .globl _main
224 _main:
225 movl _weak1(%rip), %eax
226 movl _weak2(%rip), %ebx
227 movaps _aligned(%rip), %xmm0
228 retq
230 .subsections_via_symbols
232 #--- weak-def.s
233 .section __TEXT,__text,regular,pure_instructions
235 .globl _foo
236 .weak_definition _foo
237 _foo:
238 .cfi_startproc
239 .cfi_personality 155, ___gxx_personality_v0
240 .cfi_lsda 16, Lexception
241 pushq %rbp
242 .cfi_def_cfa_offset 128
243 .cfi_offset %rbp, 48
244 movq %rsp, %rbp
245 .cfi_def_cfa_register %rbp
246 popq %rbp
247 retq
248 .cfi_endproc
250 .section __TEXT,__gcc_except_tab
251 Lexception:
252 .space 0x10
254 .subsections_via_symbols
255 #--- strong-def.s
256 .globl _foo, _bar
258 _foo:
259 .4byte 0x33333333
260 retq
262 .subsections_via_symbols
264 #--- weak-sub-lsda-r.yaml
265 ## This was generated from compiling weak-sub-lsda.s above at rev a2404f11c77e
266 ## and then running it through `ld -r`. This converts a number of unwind-related
267 ## relocations from section- to symbol-based ones.
268 --- !mach-o
269 FileHeader:
270 magic: 0xFEEDFACF
271 cputype: 0x1000007
272 cpusubtype: 0x3
273 filetype: 0x1
274 ncmds: 2
275 sizeofcmds: 464
276 flags: 0x2000
277 reserved: 0x0
278 LoadCommands:
279 - cmd: LC_SEGMENT_64
280 cmdsize: 392
281 segname: ''
282 vmaddr: 0
283 vmsize: 152
284 fileoff: 528
285 filesize: 152
286 maxprot: 7
287 initprot: 7
288 nsects: 3
289 flags: 0
290 Sections:
291 - sectname: __text
292 segname: __TEXT
293 addr: 0x0
294 size: 6
295 offset: 0x210
296 align: 0
297 reloff: 0x0
298 nreloc: 0
299 flags: 0x80000400
300 reserved1: 0x0
301 reserved2: 0x0
302 reserved3: 0x0
303 content: 554889E55DC3
304 - sectname: __gcc_except_tab
305 segname: __TEXT
306 addr: 0x6
307 size: 32
308 offset: 0x216
309 align: 0
310 reloff: 0x0
311 nreloc: 0
312 flags: 0x0
313 reserved1: 0x0
314 reserved2: 0x0
315 reserved3: 0x0
316 content: '0000000000000000000000000000000000000000000000000000000000000000'
317 - sectname: __eh_frame
318 segname: __TEXT
319 addr: 0x28
320 size: 80
321 offset: 0x238
322 align: 3
323 reloff: 0x2A8
324 nreloc: 7
325 flags: 0x0
326 reserved1: 0x0
327 reserved2: 0x0
328 reserved3: 0x0
329 content: 1C00000000000000017A504C5200017810079B0400000010100C0708900100002C00000004000000F8FFFFFFFFFFFFFF060000000000000008E7FFFFFFFFFFFFFF410E800111067A430D060000000000
330 relocations:
331 - address: 0x13
332 symbolnum: 5
333 pcrel: true
334 length: 2
335 extern: true
336 type: 4
337 scattered: false
338 value: 0
339 - address: 0x24
340 symbolnum: 2
341 pcrel: false
342 length: 2
343 extern: true
344 type: 5
345 scattered: false
346 value: 0
347 - address: 0x24
348 symbolnum: 3
349 pcrel: false
350 length: 2
351 extern: true
352 type: 0
353 scattered: false
354 value: 0
355 - address: 0x28
356 symbolnum: 3
357 pcrel: false
358 length: 3
359 extern: true
360 type: 5
361 scattered: false
362 value: 0
363 - address: 0x28
364 symbolnum: 4
365 pcrel: false
366 length: 3
367 extern: true
368 type: 0
369 scattered: false
370 value: 0
371 - address: 0x39
372 symbolnum: 3
373 pcrel: false
374 length: 3
375 extern: true
376 type: 5
377 scattered: false
378 value: 0
379 - address: 0x39
380 symbolnum: 1
381 pcrel: false
382 length: 3
383 extern: true
384 type: 0
385 scattered: false
386 value: 0
387 - sectname: __compact_unwind
388 segname: __LD
389 addr: 0x78
390 size: 32
391 offset: 0x288
392 align: 3
393 reloff: 0x2E0
394 nreloc: 4
395 flags: 0x2000000
396 reserved1: 0x0
397 reserved2: 0x0
398 reserved3: 0x0
399 content: '0000000000000000060000000000004100000000000000000000000000000000'
400 relocations:
401 - address: 0x0
402 symbolnum: 4
403 pcrel: false
404 length: 3
405 extern: true
406 type: 0
407 scattered: false
408 value: 0
409 - address: 0x18
410 symbolnum: 1
411 pcrel: false
412 length: 3
413 extern: true
414 type: 0
415 scattered: false
416 value: 0
417 - address: 0x10
418 symbolnum: 5
419 pcrel: false
420 length: 3
421 extern: true
422 type: 0
423 scattered: false
424 value: 0
425 - address: 0x18
426 symbolnum: 1
427 pcrel: false
428 length: 3
429 extern: true
430 type: 0
431 scattered: false
432 value: 0
433 - cmd: LC_SYMTAB
434 cmdsize: 24
435 symoff: 768
436 nsyms: 6
437 stroff: 864
438 strsize: 57
439 LinkEditData:
440 NameList:
441 - n_strx: 29
442 n_type: 0xE
443 n_sect: 2
444 n_desc: 0
445 n_value: 6
446 - n_strx: 34
447 n_type: 0xE
448 n_sect: 2
449 n_desc: 0
450 n_value: 22
451 - n_strx: 39
452 n_type: 0xE
453 n_sect: 3
454 n_desc: 0
455 n_value: 40
456 - n_strx: 49
457 n_type: 0xE
458 n_sect: 3
459 n_desc: 0
460 n_value: 72
461 - n_strx: 2
462 n_type: 0xF
463 n_sect: 1
464 n_desc: 128
465 n_value: 0
466 - n_strx: 7
467 n_type: 0x1
468 n_sect: 0
469 n_desc: 0
470 n_value: 0
471 StringTable:
472 - ' '
473 - _foo
474 - ___gxx_personality_v0
475 - l001
476 - l002
477 - EH_Frame1
478 - func.eh