[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