[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