forked from OSchip/llvm-project
99 lines
2.3 KiB
ArmAsm
99 lines
2.3 KiB
ArmAsm
// 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: <internal>:(.text.patch)
|
|
// CHECK: <internal>:(.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
|
|
}
|