diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-12-17 20:15:12 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-12-17 20:15:12 +0000 |
commit | 4ca86d289fccf91db3536b9204d350d342f600ad (patch) | |
tree | d47afc829a4bc1b69e438751764ca8e730e8cf34 | |
parent | 728cbc0378d165e71302884ea5f6476759ba4de5 (diff) | |
download | bcm5719-llvm-4ca86d289fccf91db3536b9204d350d342f600ad.tar.gz bcm5719-llvm-4ca86d289fccf91db3536b9204d350d342f600ad.zip |
ELF: AArch64: Fix errata patch address calculation.
The code here wants the output section offset of the instruction
requiring the errata patch, not the virtual address. Without this
change we can end up placing a patch out of range if the virtual
address of the code section is large enough.
Differential Revision: https://reviews.llvm.org/D55732
llvm-svn: 349386
-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 |