Index: lld/trunk/ELF/AArch64ErrataFix.cpp =================================================================== --- lld/trunk/ELF/AArch64ErrataFix.cpp +++ lld/trunk/ELF/AArch64ErrataFix.cpp @@ -488,6 +488,7 @@ uint64_t ISLimit; uint64_t PrevISLimit = ISD.Sections.front()->OutSecOff; uint64_t PatchUpperBound = PrevISLimit + Target->getThunkSectionSpacing(); + uint64_t OutSecAddr = ISD.Sections.front()->getParent()->Addr; // Set the OutSecOff of patches to the place where we want to insert them. // We use a similar strategy to Thunk placement. Place patches roughly @@ -498,7 +499,7 @@ ISLimit = IS->OutSecOff + IS->getSize(); if (ISLimit > PatchUpperBound) { while (PatchIt != PatchEnd) { - if ((*PatchIt)->getLDSTAddr() >= PrevISLimit) + if ((*PatchIt)->getLDSTAddr() - OutSecAddr >= PrevISLimit) break; (*PatchIt)->OutSecOff = PrevISLimit; ++PatchIt; Index: lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s =================================================================== --- lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s +++ lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s @@ -0,0 +1,19 @@ +// REQUIRES: aarch64 +// RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux %s -o %t.o +// RUN: ld.lld --fix-cortex-a53-843419 -Ttext=0x8000000 %t.o -o %t2 +// RUN: llvm-objdump -d --start-address=0x8001000 --stop-address=0x8001004 %t2 | FileCheck %s + +.section .text.01, "ax", %progbits +.balign 4096 +.space 4096 - 8 +adrp x0, thunk +ldr x1, [x1, #0] +// CHECK: thunk: +// CHECK-NEXT: b #67108872 <__CortexA53843419_8001000> +thunk: +ldr x0, [x0, :got_lo12:thunk] +ret +.space 64 * 1024 * 1024 + +.section .text.02, "ax", %progbits +.space 64 * 1024 * 1024