xref: /llvm-project/lld/test/MachO/cstring-align.s (revision 2e5989e8140d408cb13181430f60b6adfbf49d43)
1# REQUIRES: x86
2# RUN: rm -rf %t; split-file %s %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-empty.s -o %t/align-empty.o
4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-4-0.s -o %t/align-4-0.o
5# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-4-2.s -o %t/align-4-2.o
6# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-0.s -o %t/align-16-0.o
7# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-2.s -o %t/align-16-2.o
8# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-4.s -o %t/align-16-4.o
9# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-8.s -o %t/align-16-8.o
10
11## Check that we preserve the alignment of cstrings. Alignment is determined
12## not by section alignment but by the number of trailing zeros of the cstring's
13## address in the input object file.
14
15## The non-dedup case is not particularly interesting since the null bytes don't
16## get dedup'ed, meaning that the output strings get their offsets "naturally"
17## preserved.
18
19# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-4-0.o %t/align-16-0.o -o %t/align-4-0-16-0
20# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-0-16-0 | \
21# RUN:   FileCheck %s -D#OFF1=4 -D#OFF2=16
22# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-16-0.o %t/align-4-0.o -o %t/align-16-0-4-0
23# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-0-4-0 | \
24# RUN:   FileCheck %s -D#OFF1=16 -D#OFF2=20
25
26# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-4-2.o %t/align-16-0.o -o %t/align-4-2-16-0
27# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-2-16-0 | \
28# RUN:   FileCheck %s -D#OFF1=6 -D#OFF2=16
29# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-16-0.o %t/align-4-2.o -o %t/align-16-0-4-2
30# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-0-4-2 | \
31# RUN:   FileCheck %s -D#OFF1=16 -D#OFF2=22
32
33# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-4-0.o %t/align-16-2.o -o %t/align-4-0-16-2
34# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-0-16-2 | \
35# RUN:   FileCheck %s -D#OFF1=4 -D#OFF2=18
36# RUN: %lld -dylib --no-deduplicate-strings %t/align-empty.o %t/align-16-2.o %t/align-4-0.o -o %t/align-16-2-4-0
37# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-2-4-0 | \
38# RUN:   FileCheck %s -D#OFF1=18 -D#OFF2=20
39
40# CHECK:       Contents of (__TEXT,__cstring) section
41# CHECK-NEXT:  [[#%.16x,START:]]     {{$}}
42# CHECK:       [[#%.16x,START+OFF1]] a{{$}}
43# CHECK:       [[#%.16x,START+OFF2]] a{{$}}
44# CHECK-EMPTY:
45
46## The dedup cases are more interesting...
47
48## Same offset, different alignments => pick higher alignment
49# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-0.o -o %t/dedup-4-0-16-0
50# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-0 | \
51# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=16
52# RUN: %lld -dylib %t/align-empty.o %t/align-16-0.o %t/align-4-0.o -o %t/dedup-16-0-4-0
53# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-0-4-0 | \
54# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=16
55
56## 16 byte alignment vs 2 byte offset => align to 16 bytes
57# RUN: %lld -dylib %t/align-empty.o %t/align-4-2.o %t/align-16-0.o -o %t/dedup-4-2-16-0
58# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-2-16-0 | \
59# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=16
60# RUN: %lld -dylib %t/align-empty.o %t/align-16-0.o %t/align-4-2.o -o %t/dedup-16-0-4-2
61# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-0-4-2 | \
62# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=16
63
64## 4 byte alignment vs 2 byte offset => align to 4 bytes
65# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-2.o -o %t/dedup-4-0-16-2
66# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-2 | \
67# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=4
68# RUN: %lld -dylib %t/align-empty.o %t/align-16-2.o %t/align-4-0.o -o %t/dedup-16-2-4-0
69# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-2-4-0 | \
70# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=4
71
72## Both inputs are 4-byte aligned, one via offset and the other via section alignment
73# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-4.o -o %t/dedup-4-0-16-4
74# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-4 | \
75# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=4
76# RUN: %lld -dylib %t/align-empty.o %t/align-16-4.o %t/align-4-0.o -o %t/dedup-16-4-4-0
77# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-4-4-0 | \
78# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=4
79
80## 8-byte offset vs 4-byte section alignment => align to 8 bytes
81# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-8.o -o %t/dedup-4-0-16-8
82# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-8 | \
83# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=8
84# RUN: %lld -dylib %t/align-empty.o %t/align-16-8.o %t/align-4-0.o -o %t/dedup-16-8-4-0
85# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-8-4-0 | \
86# RUN:   FileCheck %s --check-prefix=DEDUP -D#OFF=8
87
88# DEDUP:       Contents of (__TEXT,__cstring) section
89# DEDUP-NEXT:  [[#%.16x,START:]]    {{$}}
90# DEDUP:       [[#%.16x,START+OFF]] a{{$}}
91# DEDUP-EMPTY:
92
93#--- align-empty.s
94## We use this file to create an empty string at the start of every output
95## file's .cstring section. This makes the test cases more interesting since LLD
96## can't place the string "a" at the trivially-aligned zero offset.
97.cstring
98.p2align 2
99.asciz ""
100
101#--- align-4-0.s
102.cstring
103.p2align 2
104.asciz "a"
105
106#--- align-4-2.s
107.cstring
108.p2align 2
109.zero 0x2
110.asciz "a"
111
112#--- align-16-0.s
113.cstring
114.p2align 4
115.asciz "a"
116
117#--- align-16-2.s
118.cstring
119.p2align 4
120.zero 0x2
121.asciz "a"
122
123#--- align-16-4.s
124.cstring
125.p2align 4
126.zero 0x4
127.asciz "a"
128
129#--- align-16-8.s
130.cstring
131.p2align 4
132.zero 0x8
133.asciz "a"
134