// REQUIRES: aarch64 // RUN: split-file %s %t // RUN: llvm-mc -filetype=obj -triple=aarch64 --asm-macro-max-nesting-depth=40000 %t/asm -o %t.o // RUN: ld.lld -T %t/lds -fix-cortex-a53-843419 %t.o -o %t2 --print-map 2>&1 | FileCheck %s /// %t2 is more than 128MiB. Delete it early. // RUN: rm %t.o %t2 //--- asm /// We use %(\parameter) to evaluate expression, which requires .altmacro. .altmacro /// Test to reproduce the conditions that trigger R_AARCH64_JUMP26 out of range /// errors in pr44071. We create a large number of patches and thunks, with an /// LLD with the fault, the patches will be inserted after the thunks and due /// to the size of the thunk section some of the patches go out of range. /// With a fixed LLD the patches are inserted before the thunks. // CHECK: :(.text.patch) // CHECK: :(.text.thunk) /// Macro to generate the cortex-a53-843419 patch sequence .macro ERRATA from, to .balign 4096 .space 4096 - 8 adrp x0, dat1 ldr x1, [x1, #0] ldr x0, [x0, :got_lo12:dat1] ret .if (\to-\from) ERRATA %(\from+1),\to .endif .endm .section .text.01, "ax", %progbits .balign 4096 .globl _start .type _start, %function .space 4096 - 8 _start: /// Generate lots of patches. ERRATA 0, 4000 .macro CALLS from, to bl far\from .if (\to-\from) CALLS %(\from+1),\to .endif .endm /// Generate long range thunks. These are inserted before the patches. Generate /// a sufficient number such that the patches must be placed before the /// .text.thunk section, and if they aren't some of the patches go out of /// range. .section .text.02, "ax", %progbits .global func .type func, %function func: CALLS 0, 20000 .section .text.03, "ax", %progbits .global space1 space1: .space (1024 * 1024 * 96) + (120 * 4 * 1024) .balign 4096 .section .text.04, "ax", %progbits .global space2 space2: .space 1024 * 1024 .macro DEFS from, to .global far\from .type far\from, %function far\from: ret .if (\to-\from) DEFS %(\from+1),\to .endif .endm /// Define the thunk targets .section .target, "ax", %progbits DEFS 0, 20000 .data .global dat1 dat1: .xword 0 //--- lds PHDRS { low PT_LOAD FLAGS(0x1 | 0x4); high PT_LOAD FLAGS(0x1 | 0x4); } SECTIONS { .text1 0x10000 : { *(.text.*) } :low .text2 0xf010000 : { *(.target) } :high }