3
3
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o
4
4
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
5
5
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/c-string-literal.s -o %t/c-string-literal.o
6
+ # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/baz.s -o %t/baz.o
6
7
8
+ # RUN: %lld -dylib %t/baz.o -o %t/libbaz.dylib
7
9
# RUN: %lld -demangle -map %t/map %t/test.o %t/foo.o %t/c-string-literal.o \
8
- # RUN: --time-trace -o %t/test
10
+ # RUN: %t/libbaz.dylib --time-trace -o %t/test
9
11
# RUN: llvm-objdump --syms --section-headers %t/test > %t/objdump
10
12
## Check that symbols in cstring sections aren't emitted
11
13
## Also check that we don't have redundant EH_Frame symbols (regression test)
12
14
# RUN: cat %t/objdump %t/map | FileCheck %s --implicit-check-not _hello_world \
13
15
# RUN: --implicit-check-not EH_Frame
14
16
# RUN: FileCheck %s --check-prefix=MAPFILE < %t/test.time-trace
15
17
16
- # CHECK: Sections:
17
- # CHECK-NEXT: Idx Name Size VMA Type
18
- # CHECK-NEXT: 0 __text {{[0-9a-f]+}} [[#%x,TEXT:]] TEXT
19
- # CHECK-NEXT: 1 __cstring {{[0-9a-f]+}} [[#%x,CSTR:]] DATA
20
- # CHECK-NEXT: 2 __unwind_info {{[0-9a-f]+}} [[#%x,UNWIND:]] DATA
21
- # CHECK-NEXT: 3 __eh_frame {{[0-9a-f]+}} [[#%x,EH_FRAME:]] DATA
22
- # CHECK-NEXT: 4 __common {{[0-9a-f]+}} [[#%x,BSS:]] BSS
18
+ # CHECK: Sections:
19
+ # CHECK-NEXT: Idx Name Size VMA Type
20
+ # CHECK-NEXT: 0 __text 0000001b [[#%x,TEXT:]] TEXT
21
+ # CHECK-NEXT: 1 __stubs 0000000c [[#%x,STUBS:]] TEXT
22
+ # CHECK-NEXT: 2 __stub_helper 0000001a [[#%x,HELPER:]] TEXT
23
+ # CHECK-NEXT: 3 __cstring 0000002b [[#%x,CSTR:]] DATA
24
+ # CHECK-NEXT: 4 __unwind_info 0000103c [[#%x,UNWIND:]] DATA
25
+ # CHECK-NEXT: 5 __eh_frame 00000038 [[#%x,EH_FRAME:]] DATA
26
+ # CHECK-NEXT: 6 __got 00000010 [[#%x,GOT:]] DATA
27
+ # CHECK-NEXT: 7 __la_symbol_ptr 00000010 [[#%x,LAZY:]] DATA
28
+ # CHECK-NEXT: 8 __data 00000008 [[#%x,DATA:]] DATA
29
+ # CHECK-NEXT: 9 __thread_ptrs 00000008 [[#%x,TLVP:]] DATA
30
+ # CHECK-NEXT: 10 __common 00000001 [[#%x,BSS:]] BSS
23
31
24
32
# CHECK: SYMBOL TABLE:
33
+ # CHECK-DAG: [[#%x,DYLD:]] l O __DATA,__data __dyld_private
25
34
# CHECK-DAG: [[#%x,MAIN:]] g F __TEXT,__text _main
26
35
# CHECK-DAG: [[#%x,NUMBER:]] g O __DATA,__common _number
27
- # CHECK-DAG: [[#%x,BAR:]] g F __TEXT,__text _bar
36
+ # CHECK-DAG: [[#%x,BAR:]] w F __TEXT,__text _bar
28
37
# CHECK-DAG: [[#%x,FOO:]] g F __TEXT,__text __ZTIN3foo3bar4MethE
29
38
# CHECK-DAG: [[#%x,HIWORLD:]] g O __TEXT,__cstring _hello_world
30
39
# CHECK-DAG: [[#%x,HIITSME:]] g O __TEXT,__cstring _hello_its_me
33
42
# CHECK-NEXT: # Arch: x86_64
34
43
# CHECK-NEXT: # Object files:
35
44
# CHECK-NEXT: [ 0] linker synthesized
36
- # CHECK-NEXT: [ 1] {{.*}}{{/|\\}}map-file.s.tmp/test.o
37
- # CHECK-NEXT: [ 2] {{.*}}{{/|\\}}map-file.s.tmp/foo.o
38
- # CHECK-NEXT: [ 3] {{.*}}{{/|\\}}map-file.s.tmp/c-string-literal.o
45
+ # CHECK-NEXT: [ 1] {{.*}}{{/|\\}}usr/lib{{/|\\}}libSystem.tbd
46
+ # CHECK-NEXT: [ 2] {{.*}}{{/|\\}}map-file.s.tmp/test.o
47
+ # CHECK-NEXT: [ 3] {{.*}}{{/|\\}}map-file.s.tmp/foo.o
48
+ # CHECK-NEXT: [ 4] {{.*}}{{/|\\}}map-file.s.tmp/c-string-literal.o
49
+ # CHECK-NEXT: [ 5] {{.*}}{{/|\\}}map-file.s.tmp/libbaz.dylib
39
50
40
51
# CHECK-NEXT: # Sections:
41
- # CHECK-NEXT: # Address Size Segment Section
42
- # CHECK-NEXT: 0x[[#%X,TEXT]] 0x{{[0-9A-F]+}} __TEXT __text
43
- # CHECK-NEXT: 0x[[#%X,CSTR]] 0x{{[0-9A-F]+}} __TEXT __cstring
44
- # CHECK-NEXT: 0x[[#%X,UNWIND]] 0x{{[0-9A-F]+}} __TEXT __unwind_info
45
- # CHECK-NEXT: 0x[[#%X,EH_FRAME]] 0x{{[0-9A-F]+}} __TEXT __eh_frame
46
- # CHECK-NEXT: 0x[[#%X,BSS]] 0x{{[0-9A-F]+}} __DATA __common
52
+ # CHECK-NEXT: # Address Size Segment Section
53
+ # CHECK-NEXT: 0x[[#%X,TEXT]] 0x{{[0-9A-F]+}} __TEXT __text
54
+ # CHECK-NEXT: 0x[[#%X,STUBS]] 0x{{[0-9A-F]+}} __TEXT __stubs
55
+ # CHECK-NEXT: 0x[[#%X,HELPER]] 0x{{[0-9A-F]+}} __TEXT __stub_helper
56
+ # CHECK-NEXT: 0x[[#%X,CSTR]] 0x{{[0-9A-F]+}} __TEXT __cstring
57
+ # CHECK-NEXT: 0x[[#%X,UNWIND]] 0x{{[0-9A-F]+}} __TEXT __unwind_info
58
+ # CHECK-NEXT: 0x[[#%X,EH_FRAME]] 0x{{[0-9A-F]+}} __TEXT __eh_frame
59
+ # CHECK-NEXT: 0x[[#%X,GOT]] 0x{{[0-9A-F]+}} __DATA_CONST __got
60
+ # CHECK-NEXT: 0x[[#%X,LAZY]] 0x{{[0-9A-F]+}} __DATA __la_symbol_ptr
61
+ # CHECK-NEXT: 0x[[#%X,DATA]] 0x{{[0-9A-F]+}} __DATA __data
62
+ # CHECK-NEXT: 0x[[#%X,TLVP]] 0x{{[0-9A-F]+}} __DATA __thread_ptrs
63
+ # CHECK-NEXT: 0x[[#%X,BSS]] 0x{{[0-9A-F]+}} __DATA __common
47
64
48
65
# CHECK-NEXT: # Symbols:
49
- # CHECK-NEXT: # Address Size File Name
50
- # CHECK-DAG: 0x[[#%X,MAIN]] 0x00000001 [ 1] _main
51
- # CHECK-DAG: 0x[[#%X,BAR]] 0x00000001 [ 1] _bar
52
- # CHECK-DAG: 0x[[#%X,FOO]] 0x00000001 [ 2] __ZTIN3foo3bar4MethE
53
- # CHECK-DAG: 0x[[#%X,HIWORLD]] 0x0000000E [ 3] literal string: Hello world!\n
54
- # CHECK-DAG: 0x[[#%X,HIITSME]] 0x0000000F [ 3] literal string: Hello, it's me
55
- # CHECK-DAG: 0x[[#%X,HIITSME + 0xf]] 0x0000000E [ 3] literal string: Hello world!\n
56
- # CHECK-DAG: 0x[[#%X,NUMBER]] 0x00000001 [ 1] _number
57
- # CHECK-DAG: 0x[[#%X,UNWIND]] 0x0000103C [ 0] compact unwind info
66
+ # CHECK-NEXT: # Address Size File Name
67
+ # CHECK-NEXT: 0x[[#%X,MAIN]] 0x00000019 [ 2] _main
68
+ # CHECK-NEXT: 0x[[#%X,BAR]] 0x00000001 [ 2] _bar
69
+ # CHECK-NEXT: 0x[[#%X,FOO]] 0x00000001 [ 3] __ZTIN3foo3bar4MethE
70
+ # CHECK-NEXT: 0x[[#%X,STUBS]] 0x00000006 [ 5] _baz
71
+ # CHECK-NEXT: 0x[[#%X,STUBS+6]] 0x00000006 [ 2] _bar
72
+ # CHECK-NEXT: 0x[[#%X,HELPER]] 0x0000001A [ 0] helper helper
73
+ # CHECK-NEXT: 0x[[#%X,HIWORLD]] 0x0000000E [ 4] literal string: Hello world!\n
74
+ # CHECK-NEXT: 0x[[#%X,HIITSME]] 0x0000000F [ 4] literal string: Hello, it's me
75
+ # CHECK-NEXT: 0x[[#%X,HIITSME+0xf]] 0x0000000E [ 4] literal string: Hello world!\n
76
+ # CHECK-NEXT: 0x[[#%X,UNWIND]] 0x0000103C [ 0] compact unwind info
58
77
## Note: ld64 prints "CIE" and "FDE for: <function>" instead of "EH_Frame".
59
- # CHECK-DAG: 0x[[#%X,EH_FRAME]] 0x00000018 [ 1] EH_Frame
60
- # CHECK-DAG: 0x[[#%X,EH_FRAME + 0x18]] 0x00000020 [ 1] EH_Frame
78
+ # CHECK-NEXT: 0x[[#%X,EH_FRAME]] 0x00000018 [ 2] EH_Frame
79
+ # CHECK-NEXT: 0x[[#%X,EH_FRAME+0x18]] 0x00000020 [ 2] EH_Frame
80
+ # CHECK-NEXT: 0x[[#%X,GOT]] 0x00000008 [ 0] non-lazy-pointer-to-local: _baz2
81
+ # CHECK-NEXT: 0x[[#%X,GOT+8]] 0x00000008 [ 0] non-lazy-pointer-to-local: dyld_stub_binder
82
+ # CHECK-NEXT: 0x[[#%X,LAZY]] 0x00000008 [ 5] _baz
83
+ # CHECK-NEXT: 0x[[#%X,LAZY+8]] 0x00000008 [ 2] _bar
84
+ # CHECK-NEXT: 0x[[#%X,DYLD]] 0x00000000 [ 0] __dyld_private
85
+ # CHECK-NEXT: 0x[[#%X,TLVP]] 0x00000008 [ 0] non-lazy-pointer-to-local: _baz_tlv
86
+ # CHECK-NEXT: 0x[[#%X,BSS]] 0x00000001 [ 2] _number
61
87
62
88
# MAPFILE: "name":"Total Write map file"
63
89
64
- # RUN: %lld -demangle -dead_strip -map %t/stripped-map %t/test.o %t/foo.o %t/c-string-literal.o -o %t/stripped
90
+ # RUN: %lld -demangle -dead_strip -map %t/stripped-map %t/test.o %t/foo.o \
91
+ # RUN: %t/c-string-literal.o %t/libbaz.dylib -o %t/stripped
65
92
# RUN: FileCheck --check-prefix=STRIPPED %s < %t/stripped-map
66
93
67
- ## C-string literals should be printed as "literal string: <C string literal>"
68
94
# STRIPPED-LABEL: Dead Stripped Symbols:
69
- # STRIPPED-DAG: <<dead>> 0x00000001 [ 1] _bar
70
- # STRIPPED-DAG: <<dead>> 0x00000001 [ 1] _number
71
- # STRIPPED-DAG: <<dead>> 0x00000001 [ 2] __ZTIN3foo3bar4MethE
72
- # STRIPPED-DAG: <<dead>> 0x0000000E [ 3 ] literal string: Hello world!\n
73
- # STRIPPED-DAG: <<dead>> 0x0000000F [ 3 ] literal string: Hello, it's me
74
- # STRIPPED-DAG: <<dead>> 0x0000000E [ 3] literal string: Hello world!\n
75
-
76
- # RUN: %lld --icf=all -map %t/icf-map %t/test.o %t/foo.o %t/c-string-literal.o -o %t/icf
95
+ # STRIPPED-DAG: <<dead>> 0x00000001 [ 2] _number
96
+ # STRIPPED-DAG: <<dead>> 0x00000001 [ 3] __ZTIN3foo3bar4MethE
97
+ # STRIPPED-DAG: <<dead>> 0x0000000E [ 4] literal string: Hello world!\n
98
+ # STRIPPED-DAG: <<dead>> 0x0000000F [ 4 ] literal string: Hello, it's me
99
+ # STRIPPED-DAG: <<dead>> 0x0000000E [ 4 ] literal string: Hello world!\n
100
+
101
+ # RUN: %lld --icf=all -map %t/icf-map %t/test.o %t/foo.o %t/c-string-literal.o \
102
+ # RUN: %t/libbaz.dylib -o /dev/null
77
103
# RUN: FileCheck --check-prefix=ICF %s < %t/icf-map
78
104
79
105
## Verify that folded symbols and cstrings have size zero. Note that ld64 prints
80
106
## folded symbols but not folded cstrings; we print both.
81
107
82
108
# ICF: Symbols:
83
- # ICF-DAG: 0x[[#%X,FOO:]] 0x00000000 [ 2 ] __ZTIN3foo3bar4MethE
84
- # ICF-DAG: 0x[[#FOO]] 0x00000001 [ 1 ] _bar
85
- # ICF-DAG: 0x[[#%X,HIWORLD:]] 0x0000000E [ 3 ] literal string: Hello world!\n
86
- # ICF-DAG: 0x[[#%X,HIWORLD]] 0x00000000 [ 3 ] literal string: Hello world!\n
109
+ # ICF-DAG: 0x[[#%X,FOO:]] 0x00000000 [ 3 ] __ZTIN3foo3bar4MethE
110
+ # ICF-DAG: 0x[[#FOO]] 0x00000001 [ 2 ] _bar
111
+ # ICF-DAG: 0x[[#%X,HIWORLD:]] 0x0000000E [ 4 ] literal string: Hello world!\n
112
+ # ICF-DAG: 0x[[#%X,HIWORLD]] 0x00000000 [ 4 ] literal string: Hello world!\n
87
113
88
114
#--- foo.s
89
115
.globl __ZTIN3foo3bar4MethE
@@ -97,10 +123,15 @@ __ZTIN3foo3bar4MethE:
97
123
#--- test.s
98
124
.comm _number, 1
99
125
.globl _main, _bar
126
+ .weak_definition _bar
100
127
101
128
_main:
102
129
.cfi_startproc
103
130
.cfi_def_cfa_offset 16
131
+ callq _bar
132
+ callq _baz
133
+ movq _baz2@GOTPCREL(%rip ), %rax
134
+ mov _baz_tlv@TLVP(%rip ), %rax
104
135
ret
105
136
.cfi_endproc
106
137
@@ -123,3 +154,17 @@ _hello_its_me:
123
154
.asciz "Hello world!\n"
124
155
125
156
.subsections_via_symbols
157
+
158
+ #--- baz.s
159
+ .globl _baz, _baz2
160
+
161
+ _baz:
162
+ nop
163
+
164
+ _baz2:
165
+ nop
166
+
167
+ .section __DATA,__thread_vars,thread_local_variables
168
+ .globl _baz_tlv
169
+ _baz_tlv:
170
+ nop
0 commit comments