Previously by default, when not using `--ifc=`, lld would not deduplicate string literals. This reveals reliance on undefined behavior where string literal addresses are compared instead of using string equality checks. While ideally you would be able to easily identify and eliminate the reliance on this UB, this can be difficult, especially for third party code, and increases the friction and risk of users migrating to lld. This flips the default to deduplicate strings unless `--no-deduplicate-strings` is passed, matching ld64's behavior. Differential Revision: https://reviews.llvm.org/D140517
134 lines
5.9 KiB
ArmAsm
134 lines
5.9 KiB
ArmAsm
# REQUIRES: x86
|
|
# RUN: rm -rf %t; split-file %s %t
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-empty.s -o %t/align-empty.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-4-0.s -o %t/align-4-0.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-4-2.s -o %t/align-4-2.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-0.s -o %t/align-16-0.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-2.s -o %t/align-16-2.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-4.s -o %t/align-16-4.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/align-16-8.s -o %t/align-16-8.o
|
|
|
|
## Check that we preserve the alignment of cstrings. Alignment is determined
|
|
## not by section alignment but by the number of trailing zeros of the cstring's
|
|
## address in the input object file.
|
|
|
|
## The non-dedup case is not particularly interesting since the null bytes don't
|
|
## get dedup'ed, meaning that the output strings get their offsets "naturally"
|
|
## preserved.
|
|
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-0-16-0 | \
|
|
# RUN: FileCheck %s -D#OFF1=4 -D#OFF2=16
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-0-4-0 | \
|
|
# RUN: FileCheck %s -D#OFF1=16 -D#OFF2=20
|
|
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-2-16-0 | \
|
|
# RUN: FileCheck %s -D#OFF1=6 -D#OFF2=16
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-0-4-2 | \
|
|
# RUN: FileCheck %s -D#OFF1=16 -D#OFF2=22
|
|
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-4-0-16-2 | \
|
|
# RUN: FileCheck %s -D#OFF1=4 -D#OFF2=18
|
|
# 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
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/align-16-2-4-0 | \
|
|
# RUN: FileCheck %s -D#OFF1=18 -D#OFF2=20
|
|
|
|
# CHECK: Contents of (__TEXT,__cstring) section
|
|
# CHECK-NEXT: [[#%.16x,START:]] {{$}}
|
|
# CHECK: [[#%.16x,START+OFF1]] a{{$}}
|
|
# CHECK: [[#%.16x,START+OFF2]] a{{$}}
|
|
# CHECK-EMPTY:
|
|
|
|
## The dedup cases are more interesting...
|
|
|
|
## Same offset, different alignments => pick higher alignment
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-0.o -o %t/dedup-4-0-16-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=16
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-16-0.o %t/align-4-0.o -o %t/dedup-16-0-4-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-0-4-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=16
|
|
|
|
## 16 byte alignment vs 2 byte offset => align to 16 bytes
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-4-2.o %t/align-16-0.o -o %t/dedup-4-2-16-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-2-16-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=16
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-16-0.o %t/align-4-2.o -o %t/dedup-16-0-4-2
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-0-4-2 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=16
|
|
|
|
## 4 byte alignment vs 2 byte offset => align to 4 bytes
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-2.o -o %t/dedup-4-0-16-2
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-2 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=4
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-16-2.o %t/align-4-0.o -o %t/dedup-16-2-4-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-2-4-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=4
|
|
|
|
## Both inputs are 4-byte aligned, one via offset and the other via section alignment
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-4.o -o %t/dedup-4-0-16-4
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-4 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=4
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-16-4.o %t/align-4-0.o -o %t/dedup-16-4-4-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-4-4-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=4
|
|
|
|
## 8-byte offset vs 4-byte section alignment => align to 8 bytes
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-4-0.o %t/align-16-8.o -o %t/dedup-4-0-16-8
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-4-0-16-8 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=8
|
|
# RUN: %lld -dylib %t/align-empty.o %t/align-16-8.o %t/align-4-0.o -o %t/dedup-16-8-4-0
|
|
# RUN: llvm-objdump --macho --section="__TEXT,__cstring" %t/dedup-16-8-4-0 | \
|
|
# RUN: FileCheck %s --check-prefix=DEDUP -D#OFF=8
|
|
|
|
# DEDUP: Contents of (__TEXT,__cstring) section
|
|
# DEDUP-NEXT: [[#%.16x,START:]] {{$}}
|
|
# DEDUP: [[#%.16x,START+OFF]] a{{$}}
|
|
# DEDUP-EMPTY:
|
|
|
|
#--- align-empty.s
|
|
## We use this file to create an empty string at the start of every output
|
|
## file's .cstring section. This makes the test cases more interesting since LLD
|
|
## can't place the string "a" at the trivially-aligned zero offset.
|
|
.cstring
|
|
.p2align 2
|
|
.asciz ""
|
|
|
|
#--- align-4-0.s
|
|
.cstring
|
|
.p2align 2
|
|
.asciz "a"
|
|
|
|
#--- align-4-2.s
|
|
.cstring
|
|
.p2align 2
|
|
.zero 0x2
|
|
.asciz "a"
|
|
|
|
#--- align-16-0.s
|
|
.cstring
|
|
.p2align 4
|
|
.asciz "a"
|
|
|
|
#--- align-16-2.s
|
|
.cstring
|
|
.p2align 4
|
|
.zero 0x2
|
|
.asciz "a"
|
|
|
|
#--- align-16-4.s
|
|
.cstring
|
|
.p2align 4
|
|
.zero 0x4
|
|
.asciz "a"
|
|
|
|
#--- align-16-8.s
|
|
.cstring
|
|
.p2align 4
|
|
.zero 0x8
|
|
.asciz "a"
|