| # 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" |