
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`)
59 lines
2.0 KiB
ArmAsm
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
|