Files
clang-p2996/lld/test/ELF/aarch64-thunk-script.s
Peter Smith d0cdc5ddd7 [LLD][ELF][AArch64] Add AArch64 short range thunk support
The AArch64 branch immediate instruction has a 128MiB range. This
makes it suitable for use a short range thunk in the same way as
short thunks are implemented in Arm and PPC. This patch adds
support for short range thunks to AArch64.

Adding short range thunk support should mean that OutputSections
can grow to nearly 256 MiB in size without needing long-range
indirect branches.

Differential Revision: https://reviews.llvm.org/D148701
2023-04-24 13:48:22 +01:00

66 lines
1.9 KiB
ArmAsm

// REQUIRES: aarch64
// RUN: split-file %s %t
// RUN: llvm-mc -filetype=obj -triple=aarch64 %t/asm -o %t.o
// RUN: ld.lld --script %t/lds %t.o -o %t/out
// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t/out | FileCheck %s
// RUN: llvm-nm --no-sort --special-syms %t/out | FileCheck --check-prefix=NM %s
//--- asm
// Check that we have the out of branch range calculation right. The immediate
// field is signed so we have a slightly higher negative displacement.
.section .text_low, "ax", %progbits
.globl _start
.type _start, %function
_start:
// Need thunk to high_target@plt
bl high_target
// Need thunk to .text_high+4
bl .text_high+4
ret
.section .text_high, "ax", %progbits
.globl high_target
.type high_target, %function
high_target:
// No Thunk needed as we are within signed immediate range
bl _start
ret
// CHECK: Disassembly of section .text_low:
// CHECK-EMPTY:
// CHECK-NEXT: <_start>:
// CHECK-NEXT: 2000: bl 0x200c <__AArch64AbsLongThunk_high_target>
// CHECK-NEXT: 2004: bl 0x2010 <__AArch64AbsLongThunk_>
// CHECK-NEXT: ret
// CHECK: <__AArch64AbsLongThunk_high_target>:
// CHECK-NEXT: 200c: b 0x8002000 <high_target>
// CHECK: <__AArch64AbsLongThunk_>:
// CHECK-NEXT: 2010: b 0x8002004 <high_target+0x4>
// CHECK: Disassembly of section .text_high:
// CHECK-EMPTY:
// CHECK-NEXT: <high_target>:
// CHECK-NEXT: 8002000: bl 0x2000 <_start>
// CHECK-NEXT: ret
/// Local symbols copied from %t.o
// NM: t $x.0
// NM-NEXT: t $x.1
/// Local thunk symbols.
// NM-NEXT: t __AArch64AbsLongThunk_high_target
// NM-NEXT: t $x
// NM-NEXT: t __AArch64AbsLongThunk_{{$}}
// NM-NEXT: t $x
/// Global symbols.
// NM-NEXT: T _start
// NM-NEXT: T high_target
//--- lds
PHDRS {
low PT_LOAD FLAGS(0x1 | 0x4);
high PT_LOAD FLAGS(0x1 | 0x4);
}
SECTIONS {
.text_low 0x2000: { *(.text_low) } :low
.text_high 0x8002000 : { *(.text_high) } :high
}