File: local-alias-to-weak.s

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (149 lines) | stat: -rw-r--r-- 5,906 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# REQUIRES: x86
## This test checks that when we coalesce weak definitions, their local symbol
## aliases defs don't cause the coalesced data to be retained. This was
## motivated by MC's aarch64 backend which automatically creates `ltmp<N>`
## symbols at the start of each .text section. These symbols are frequently
## aliases of other symbols created by clang or other inputs to MC. I've chosen
## to explicitly create them here since we can then reference those symbols for
## a more complete test.
##
## Not retaining the data matters for more than just size -- we have a use case
## that depends on proper data coalescing to emit a valid file format. We also
## need this behavior to properly deduplicate the __objc_protolist section;
## failure to do this can result in dyld crashing on iOS 13.
##
## Finally, ld64 does all this regardless of whether .subsections_via_symbols is
## specified. We don't. But again, given how rare the lack of that directive is
## (I've only seen it from hand-written assembly inputs), I don't think we need
## to worry about it.

# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-then-local.s -o %t/weak-then-local.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/local-then-weak.s -o %t/local-then-weak.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/no-subsections.s -o %t/no-subsections.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/no-dead-strip.s -o %t/no-dead-strip.o

# RUN: %lld -lSystem -dylib %t/weak-then-local.o %t/local-then-weak.o -o %t/test1
# RUN: llvm-objdump --macho --syms --section="__DATA,__data" --weak-bind %t/test1 | FileCheck %s
# RUN: %lld -lSystem -dylib %t/local-then-weak.o %t/weak-then-local.o -o %t/test2
# RUN: llvm-objdump --macho --syms --section="__DATA,__data" --weak-bind %t/test2 | FileCheck %s

## Check that we only have one copy of 0x123 in the data, not two.
# CHECK:       Contents of (__DATA,__data) section
# CHECK-NEXT:  0000000000001000  23 01 00 00 00 00 00 00 00 10 00 00 00 00 00 00 {{$}}
# CHECK-NEXT:  0000000000001010  00 10 00 00 00 00 00 00 {{$}}
# CHECK-EMPTY:
# CHECK-NEXT:  SYMBOL TABLE:
# CHECK-NEXT:  0000000000001000 l     O __DATA,__data _alias
# CHECK-NEXT:  0000000000001008 l     O __DATA,__data _ref
# CHECK-NEXT:  0000000000001000 l     O __DATA,__data _alias
# CHECK-NEXT:  0000000000001010 l     O __DATA,__data _ref
# CHECK-NEXT:  0000000000001000  w    O __DATA,__data _weak
# CHECK-NEXT:  0000000000000000         *UND* dyld_stub_binder
# CHECK-EMPTY:
## Even though the references were to the non-weak `_alias` symbols, ld64 still
## emits weak binds as if they were the `_weak` symbol itself. We do not. I
## don't know of any programs that rely on this behavior, so I'm just
## documenting it here.
# CHECK-NEXT:  Weak bind table:
# CHECK-NEXT:  segment  section            address     type       addend   symbol
# CHECK-EMPTY:

# RUN: %lld -lSystem -dylib %t/local-then-weak.o %t/no-subsections.o -o %t/sub-nosub
# RUN: llvm-objdump --macho --syms --section="__DATA,__data" %t/sub-nosub | FileCheck %s --check-prefix SUB-NOSUB

## This test case demonstrates a shortcoming of LLD: If .subsections_via_symbols
## isn't enabled, we don't elide the contents of coalesced weak symbols if they
## are part of a section that has other non-coalesced symbols. In contrast, LD64
## does elide the contents.
# SUB-NOSUB:       Contents of (__DATA,__data) section
# SUB-NOSUB-NEXT:  0000000000001000    23 01 00 00 00 00 00 00 00 10 00 00 00 00 00 00
# SUB-NOSUB-NEXT:  0000000000001010    00 00 00 00 00 00 00 00 23 01 00 00 00 00 00 00
# SUB-NOSUB-EMPTY:
# SUB-NOSUB-NEXT:  SYMBOL TABLE:
# SUB-NOSUB-NEXT:  0000000000001000 l     O __DATA,__data _alias
# SUB-NOSUB-NEXT:  0000000000001008 l     O __DATA,__data _ref
# SUB-NOSUB-NEXT:  0000000000001010 l     O __DATA,__data _zeros
# SUB-NOSUB-NEXT:  0000000000001000 l     O __DATA,__data _alias
# SUB-NOSUB-NEXT:  0000000000001000  w    O __DATA,__data _weak
# SUB-NOSUB-NEXT:  0000000000000000         *UND* dyld_stub_binder

# RUN: %lld -lSystem -dylib %t/no-subsections.o %t/local-then-weak.o -o %t/nosub-sub
# RUN: llvm-objdump --macho --syms --section="__DATA,__data" %t/nosub-sub | FileCheck %s --check-prefix NOSUB-SUB

# NOSUB-SUB:       Contents of (__DATA,__data) section
# NOSUB-SUB-NEXT:  0000000000001000    00 00 00 00 00 00 00 00 23 01 00 00 00 00 00 00
# NOSUB-SUB-NEXT:  0000000000001010    08 10 00 00 00 00 00 00 {{$}}
# NOSUB-SUB-EMPTY:
# NOSUB-SUB-NEXT:  SYMBOL TABLE:
# NOSUB-SUB-NEXT:  0000000000001000 l     O __DATA,__data _zeros
# NOSUB-SUB-NEXT:  0000000000001008 l     O __DATA,__data _alias
# NOSUB-SUB-NEXT:  0000000000001008 l     O __DATA,__data _alias
# NOSUB-SUB-NEXT:  0000000000001010 l     O __DATA,__data _ref
# NOSUB-SUB-NEXT:  0000000000001008  w    O __DATA,__data _weak
# NOSUB-SUB-NEXT:  0000000000000000         *UND* dyld_stub_binder

## Verify that we don't drop any flags that the aliases have (such as
## .no_dead_strip). This is a regression test. We previously had subsections
## that were mistakenly stripped.

# RUN: %lld -lSystem -dead_strip %t/no-dead-strip.o -o %t/no-dead-strip
# RUN: llvm-objdump --macho --section-headers %t/no-dead-strip | FileCheck %s \
# RUN:   --check-prefix=NO-DEAD-STRIP
# NO-DEAD-STRIP: __data        00000010

#--- weak-then-local.s
.globl _weak
.weak_definition _weak
.data
_weak:
_alias:
  .quad 0x123

_ref:
  .quad _alias

.subsections_via_symbols

#--- local-then-weak.s
.globl _weak
.weak_definition _weak
.data
_alias:
_weak:
  .quad 0x123

_ref:
  .quad _alias

.subsections_via_symbols

#--- no-subsections.s
.globl _weak
.weak_definition _weak
.data
_zeros:
.space 8

_weak:
_alias:
  .quad 0x123

#--- no-dead-strip.s
.globl _main

_main:
  ret

.data
.no_dead_strip l_foo, l_bar

_foo:
l_foo:
  .quad 0x123

l_bar:
_bar:
  .quad 0x123

.subsections_via_symbols