xref: /llvm-project/lld/test/MachO/icf-literals.s (revision c242e10c74d28d97a9e7f99f00a06a9a599be402)
1# REQUIRES: x86
2# RUN: rm -rf %t; mkdir %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t/test.o
4# RUN: %lld -lSystem --icf=all -o %t/test %t/test.o
5# RUN: llvm-objdump --macho --syms -d %t/test | FileCheck %s
6
7# CHECK:      _main:
8# CHECK-NEXT: callq   _foo2_ref
9# CHECK-NEXT: callq   _foo2_ref
10# CHECK-NEXT: callq   _foo2_neg_offset_ref
11# CHECK-NEXT: callq   _foo2_neg_offset_ref
12# CHECK-NEXT: callq   _foo2_pos_offset_ref
13# CHECK-NEXT: callq   _foo2_pos_offset_ref
14# CHECK-NEXT: callq   _bar2_ref
15# CHECK-NEXT: callq   _bar2_ref
16# CHECK-NEXT: callq   _baz2_ref
17# CHECK-NEXT: callq   _baz2_ref
18# CHECK-NEXT: callq   _qux2_ref
19# CHECK-NEXT: callq   _qux2_ref
20# CHECK-NEXT: callq   _sub_str_a_b
21# CHECK-NEXT: callq   _sub_str_b_a
22# CHECK-NEXT: callq   _sub_lit_a_b
23# CHECK-NEXT: callq   _sub_lit_b_a
24
25# CHECK:      [[#%.16x,FOO:]]     l     O __TEXT,__cstring _foo1
26# CHECK-NEXT: [[#%.16x,FOO:]]     l     O __TEXT,__cstring _foo2
27# CHECK-NEXT: [[#%.16x,BAR:]]     l     O __TEXT,__cstring _bar1
28# CHECK-NEXT: [[#%.16x,BAR:]]     l     O __TEXT,__cstring _bar2
29# CHECK-NEXT: [[#%.16x,BAZ:]]     l     O __TEXT,__literals _baz1
30# CHECK-NEXT: [[#%.16x,BAZ:]]     l     O __TEXT,__literals _baz2
31# CHECK-NEXT: [[#%.16x,QUX:]]     l     O __TEXT,__literals _qux1
32# CHECK-NEXT: [[#%.16x,QUX:]]     l     O __TEXT,__literals _qux2
33# CHECK-NEXT: [[#%.16x,FOO_REF:]] l     F __TEXT,__text _foo1_ref
34# CHECK-NEXT: [[#%.16x,FOO_REF:]] l     F __TEXT,__text _foo2_ref
35# CHECK-NEXT: [[#%.16x,FOO_NEG:]] l     F __TEXT,__text _foo1_neg_offset_ref
36# CHECK-NEXT: [[#%.16x,FOO_NEG]]  l     F __TEXT,__text _foo2_neg_offset_ref
37# CHECK-NEXT: [[#%.16x,FOO_POS:]] l     F __TEXT,__text _foo1_pos_offset_ref
38# CHECK-NEXT: [[#%.16x,FOO_POS]]  l     F __TEXT,__text _foo2_pos_offset_ref
39# CHECK-NEXT: [[#%.16x,BAR_REF:]] l     F __TEXT,__text _bar1_ref
40# CHECK-NEXT: [[#%.16x,BAR_REF:]] l     F __TEXT,__text _bar2_ref
41# CHECK-NEXT: [[#%.16x,BAZ_REF:]] l     F __TEXT,__text _baz1_ref
42# CHECK-NEXT: [[#%.16x,BAZ_REF:]] l     F __TEXT,__text _baz2_ref
43# CHECK-NEXT: [[#%.16x,QUX_REF:]] l     F __TEXT,__text _qux1_ref
44# CHECK-NEXT: [[#%.16x,QUX_REF:]] l     F __TEXT,__text _qux2_ref
45
46## _foo1 vs _bar1: same section, different offsets
47## _foo1 vs _baz1: same offset, different sections
48
49.cstring
50_foo1:
51  .asciz "foo"
52_foo2:
53  .asciz "foo"
54_bar1:
55  .asciz "bar"
56_bar2:
57  .asciz "bar"
58
59.literal8
60_baz1:
61  .quad 0xdead
62_baz2:
63  .quad 0xdead
64_qux1:
65  .quad 0xbeef
66_qux2:
67  .quad 0xbeef
68
69.text
70_foo1_ref:
71  leaq _foo1(%rip), %rax
72_foo2_ref:
73  leaq _foo2(%rip), %rax
74_foo1_neg_offset_ref:
75## Check that we can correctly handle `_foo1-32` even though it points outside
76## the __cstring section.
77  leaq _foo1-32(%rip), %rax
78_foo2_neg_offset_ref:
79  leaq _foo2-32(%rip), %rax
80_foo1_pos_offset_ref:
81  leaq _foo1+4(%rip), %rax
82_foo2_pos_offset_ref:
83## Although `_foo2+4` points at _bar1 in the input object file, we shouldn't
84## dedup references to _foo2+4 with references to _bar1.
85  leaq _foo2+4(%rip), %rax
86_bar1_ref:
87  leaq _bar1(%rip), %rax
88_bar2_ref:
89  leaq _bar2(%rip), %rax
90_baz1_ref:
91  movq _baz1(%rip), %rax
92_baz2_ref:
93  movq _baz2(%rip), %rax
94_qux1_ref:
95  movq _qux1(%rip), %rax
96_qux2_ref:
97  movq _qux2(%rip), %rax
98
99## _sub_str_a_b and _sub_str_b_a should not be folded: They contain relocations
100## against the same string symbols, but in a different order and hence
101## return different numbers.
102_sub_str_a_b:
103  leaq _foo2(%rip), %rdx
104  leaq _bar2(%rip), %rax
105  subq %rdx, %rax
106_sub_str_b_a:
107  leaq _bar2(%rip), %rdx
108  leaq _foo2(%rip), %rax
109  subq %rdx, %rax
110
111## Same with literals instead of strings.
112_sub_lit_a_b:
113  movq _baz2(%rip), %rax
114  subq _qux2(%rip), %rax
115_sub_lit_b_a:
116  movq _qux2(%rip), %rax
117  subq _baz2(%rip), %rax
118
119
120.globl _main
121_main:
122  callq _foo1_ref
123  callq _foo2_ref
124  callq _foo1_neg_offset_ref
125  callq _foo2_neg_offset_ref
126  callq _foo1_pos_offset_ref
127  callq _foo2_pos_offset_ref
128  callq _bar1_ref
129  callq _bar2_ref
130  callq _baz1_ref
131  callq _baz2_ref
132  callq _qux1_ref
133  callq _qux2_ref
134  callq _sub_str_a_b
135  callq _sub_str_b_a
136  callq _sub_lit_a_b
137  callq _sub_lit_b_a
138
139.subsections_via_symbols
140