[lld] r349386 - ELF: AArch64: Fix errata patch address calculation.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 17 12:15:12 PST 2018
Author: pcc
Date: Mon Dec 17 12:15:12 2018
New Revision: 349386
URL: http://llvm.org/viewvc/llvm-project?rev=349386&view=rev
Log:
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
Added:
lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s
Modified:
lld/trunk/ELF/AArch64ErrataFix.cpp
Modified: lld/trunk/ELF/AArch64ErrataFix.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/AArch64ErrataFix.cpp?rev=349386&r1=349385&r2=349386&view=diff
==============================================================================
--- lld/trunk/ELF/AArch64ErrataFix.cpp (original)
+++ lld/trunk/ELF/AArch64ErrataFix.cpp Mon Dec 17 12:15:12 2018
@@ -488,6 +488,7 @@ void AArch64Err843419Patcher::insertPatc
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::insertPatc
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;
Added: lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s?rev=349386&view=auto
==============================================================================
--- lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s (added)
+++ lld/trunk/test/ELF/aarch64-cortex-a53-843419-large2.s Mon Dec 17 12:15:12 2018
@@ -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
More information about the llvm-commits
mailing list