llvm-project/lld/test/MachO/section-order.s
Leonard Grey 58f3c5e696
[lld-macho] Fix thunks for non-__text TEXT sections (#99052)
This supersedes https://github.com/llvm/llvm-project/pull/87818 and
fixes https://github.com/llvm/llvm-project/issues/52767

When calculating arm64 thunks, we make a few assumptions that may not
hold when considering code sections outside of `__text`:

1. That a section needs thunks only if its size is larger than the
branch range.
2. That any calls into `__stubs` are necessarily forward jumps (that is,
the section with the jump is ordered before `__stubs`)

Sections like this exist in the wild, most prominently the
`__lcxx_overrides` section introduced in
https://github.com/llvm/llvm-project/pull/69498

This change:
- Ensures that if one section in `__TEXT` gets thunks, all of them do.
- Makes all code sections in `__TEXT` contiguous (and guaranteed to be
placed before `__stubs`)
2024-07-23 11:02:55 -04:00

59 lines
2.0 KiB
ArmAsm

# REQUIRES: x86
## Check that section ordering follows from input file ordering.
# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/1.s -o %t/1.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/2.s -o %t/2.o
# RUN: %lld -dylib %t/1.o %t/2.o -o %t/12
# RUN: %lld -dylib %t/2.o %t/1.o -o %t/21
# RUN: %lld -dylib %t/2.o %t/1.o -o %t/synth-section-order \
# RUN: -add_empty_section __TEXT __objc_stubs \
# RUN: -add_empty_section __TEXT __init_offsets \
# RUN: -add_empty_section __TEXT __stubs \
# RUN: -add_empty_section __TEXT __stub_helper \
# RUN: -add_empty_section __TEXT __unwind_info \
# RUN: -add_empty_section __TEXT __eh_frame \
# RUN: -add_empty_section __DATA __objc_selrefs
# RUN: llvm-objdump --macho --section-headers %t/12 | FileCheck %s --check-prefix=CHECK-12
# RUN: llvm-objdump --macho --section-headers %t/21 | FileCheck %s --check-prefix=CHECK-21
# RUN: llvm-objdump --macho --section-headers %t/synth-section-order | FileCheck %s --check-prefix=CHECK-SYNTHETIC-ORDER
# CHECK-12: __text
# CHECK-12-NEXT: foo
# CHECK-12-NEXT: bar
# CHECK-12-NEXT: __cstring
# CHECK-21: __text
## `foo` always sorts next to `__text` since it's a code section
## and needs to be adjacent for arm64 thunk calculations
# CHECK-21-NEXT: foo
# CHECK-21-NEXT: __cstring
# CHECK-21-NEXT: bar
# CHECK-SYNTHETIC-ORDER: __text
# CHECK-SYNTHETIC-ORDER-NEXT: foo
# CHECK-SYNTHETIC-ORDER-NEXT: __stubs
# CHECK-SYNTHETIC-ORDER-NEXT: __stub_helper
# CHECK-SYNTHETIC-ORDER-NEXT: __objc_stubs
# CHECK-SYNTHETIC-ORDER-NEXT: __init_offsets
# CHECK-SYNTHETIC-ORDER-NEXT: __cstring
# CHECK-SYNTHETIC-ORDER-NEXT: bar
# CHECK-SYNTHETIC-ORDER-NEXT: __unwind_info
# CHECK-SYNTHETIC-ORDER-NEXT: __eh_frame
# CHECK-SYNTHETIC-ORDER-NEXT: __objc_selrefs
#--- 1.s
.section __TEXT,foo
.space 1
.section __TEXT,bar
.space 1
.cstring
.asciz ""
#--- 2.s
.cstring
.asciz ""
.section __TEXT,bar
.space 1
.section __TEXT,foo,regular,pure_instructions
.space 1