[llvm] 47cfffe - [JITLink][AArch64] Handle addends on PAGE21 / PAGEOFF12 relocations.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 5 08:51:45 PDT 2020
Author: Lang Hames
Date: 2020-08-05T08:50:46-07:00
New Revision: 47cfffe893f345285ac9fb9c24b268dfcdc6aa38
URL: https://github.com/llvm/llvm-project/commit/47cfffe893f345285ac9fb9c24b268dfcdc6aa38
DIFF: https://github.com/llvm/llvm-project/commit/47cfffe893f345285ac9fb9c24b268dfcdc6aa38.diff
LOG: [JITLink][AArch64] Handle addends on PAGE21 / PAGEOFF12 relocations.
Added:
Modified:
llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
index e5607e4d51f8..df5817681e20 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
@@ -587,10 +587,12 @@ class MachOJITLinker_arm64 : public JITLinker<MachOJITLinker_arm64> {
}
case Page21:
case GOTPage21: {
- assert(E.getAddend() == 0 && "PAGE21/GOTPAGE21 with non-zero addend");
+ assert((E.getKind() != GOTPage21 || E.getAddend() == 0) &&
+ "GOTPAGE21 with non-zero addend");
uint64_t TargetPage =
- E.getTarget().getAddress() & ~static_cast<uint64_t>(4096 - 1);
- uint64_t PCPage = B.getAddress() & ~static_cast<uint64_t>(4096 - 1);
+ (E.getTarget().getAddress() + E.getAddend()) &
+ ~static_cast<uint64_t>(4096 - 1);
+ uint64_t PCPage = FixupAddress & ~static_cast<uint64_t>(4096 - 1);
int64_t PageDelta = TargetPage - PCPage;
if (PageDelta < -(1 << 30) || PageDelta > ((1 << 30) - 1))
@@ -606,8 +608,8 @@ class MachOJITLinker_arm64 : public JITLinker<MachOJITLinker_arm64> {
break;
}
case PageOffset12: {
- assert(E.getAddend() == 0 && "PAGEOFF12 with non-zero addend");
- uint64_t TargetOffset = E.getTarget().getAddress() & 0xfff;
+ uint64_t TargetOffset =
+ (E.getTarget().getAddress() + E.getAddend()) & 0xfff;
uint32_t RawInstr = *(ulittle32_t *)FixupPtr;
unsigned ImmShift = getPageOffset12Shift(RawInstr);
diff --git a/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s
index b72e3b9d3a1d..4bf084296e4f 100644
--- a/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s
+++ b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s
@@ -58,61 +58,61 @@ test_gotpageoff12:
# For the GOTPAGEOFF12 relocation we test the ADD instruction, all LDR/GPR
# variants and all LDR/Neon variants.
#
-# jitlink-check: decode_operand(test_page21, 1) = (named_data[32:12] - test_page21[32:12])
-# jitlink-check: decode_operand(test_pageoff12add, 2) = named_data[11:0]
-# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = named_data[11:0]
-# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = named_data[11:1]
-# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = named_data[11:2]
-# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = named_data[11:3]
-# jitlink-check: decode_operand(test_pageoff12neon8, 2) = named_data[11:0]
-# jitlink-check: decode_operand(test_pageoff12neon16, 2) = named_data[11:1]
-# jitlink-check: decode_operand(test_pageoff12neon32, 2) = named_data[11:2]
-# jitlink-check: decode_operand(test_pageoff12neon64, 2) = named_data[11:3]
-# jitlink-check: decode_operand(test_pageoff12neon128, 2) = named_data[11:4]
+# jitlink-check: decode_operand(test_page21, 1) = ((named_data + 256) - test_page21)[32:12]
+# jitlink-check: decode_operand(test_pageoff12add, 2) = (named_data + 256)[11:0]
+# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = (named_data + 256)[11:0]
+# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = (named_data + 256)[11:1]
+# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = (named_data + 256)[11:2]
+# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = (named_data + 256)[11:3]
+# jitlink-check: decode_operand(test_pageoff12neon8, 2) = (named_data + 256)[11:0]
+# jitlink-check: decode_operand(test_pageoff12neon16, 2) = (named_data + 256)[11:1]
+# jitlink-check: decode_operand(test_pageoff12neon32, 2) = (named_data + 256)[11:2]
+# jitlink-check: decode_operand(test_pageoff12neon64, 2) = (named_data + 256)[11:3]
+# jitlink-check: decode_operand(test_pageoff12neon128, 2) = (named_data + 256)[11:4]
.globl test_page21
.p2align 2
test_page21:
- adrp x0, named_data at PAGE
+ adrp x0, named_data at PAGE + 256
.globl test_pageoff12add
test_pageoff12add:
- add x0, x0, named_data at PAGEOFF
+ add x0, x0, named_data at PAGEOFF + 256
.globl test_pageoff12gpr8
test_pageoff12gpr8:
- ldrb w0, [x0, named_data at PAGEOFF]
+ ldrb w0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12gpr16
test_pageoff12gpr16:
- ldrh w0, [x0, named_data at PAGEOFF]
+ ldrh w0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12gpr32
test_pageoff12gpr32:
- ldr w0, [x0, named_data at PAGEOFF]
+ ldr w0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12gpr64
test_pageoff12gpr64:
- ldr x0, [x0, named_data at PAGEOFF]
+ ldr x0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12neon8
test_pageoff12neon8:
- ldr b0, [x0, named_data at PAGEOFF]
+ ldr b0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12neon16
test_pageoff12neon16:
- ldr h0, [x0, named_data at PAGEOFF]
+ ldr h0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12neon32
test_pageoff12neon32:
- ldr s0, [x0, named_data at PAGEOFF]
+ ldr s0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12neon64
test_pageoff12neon64:
- ldr d0, [x0, named_data at PAGEOFF]
+ ldr d0, [x0, named_data at PAGEOFF + 256]
.globl test_pageoff12neon128
test_pageoff12neon128:
- ldr q0, [x0, named_data at PAGEOFF]
+ ldr q0, [x0, named_data at PAGEOFF + 256]
# Check that calls to external functions trigger the generation of stubs and GOT
# entries.
More information about the llvm-commits
mailing list