diff options
-rw-r--r-- | lld/ELF/AArch64ErrataFix.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/aarch64-cortex-a53-843419-large2.s | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/lld/ELF/AArch64ErrataFix.cpp b/lld/ELF/AArch64ErrataFix.cpp index 239799d3f35..ac753cb5826 100644 --- a/lld/ELF/AArch64ErrataFix.cpp +++ b/lld/ELF/AArch64ErrataFix.cpp @@ -488,6 +488,7 @@ void AArch64Err843419Patcher::insertPatches( 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 @@ void AArch64Err843419Patcher::insertPatches( 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; diff --git a/lld/test/ELF/aarch64-cortex-a53-843419-large2.s b/lld/test/ELF/aarch64-cortex-a53-843419-large2.s new file mode 100644 index 00000000000..fdb8a445e00 --- /dev/null +++ b/lld/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 |