summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2018-12-17 20:15:12 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2018-12-17 20:15:12 +0000
commit4ca86d289fccf91db3536b9204d350d342f600ad (patch)
treed47afc829a4bc1b69e438751764ca8e730e8cf34
parent728cbc0378d165e71302884ea5f6476759ba4de5 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--lld/test/ELF/aarch64-cortex-a53-843419-large2.s19
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
OpenPOWER on IntegriCloud