[llvm] r374499 - [JITLink] Fix MachO/arm64 GOTPAGEOFF encoding.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 10 18:50:31 PDT 2019


Author: lhames
Date: Thu Oct 10 18:50:31 2019
New Revision: 374499

URL: http://llvm.org/viewvc/llvm-project?rev=374499&view=rev
Log:
[JITLink] Fix MachO/arm64 GOTPAGEOFF encoding.

The original implementation failed to shift the immediate down.

This should fix some of the bot failures due to r374476.

Modified:
    llvm/trunk/lib/ExecutionEngine/JITLink/MachO_arm64.cpp

Modified: llvm/trunk/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JITLink/MachO_arm64.cpp?rev=374499&r1=374498&r2=374499&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/JITLink/MachO_arm64.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/JITLink/MachO_arm64.cpp Thu Oct 10 18:50:31 2019
@@ -614,12 +614,15 @@ private:
     }
     case GOTPageOffset12: {
       assert(E.getAddend() == 0 && "GOTPAGEOF12 with non-zero addend");
-      uint64_t TargetOffset = E.getTarget().getAddress() & 0xfff;
 
       uint32_t RawInstr = *(ulittle32_t *)FixupPtr;
       assert((RawInstr & 0xfffffc00) == 0xf9400000 &&
              "RawInstr isn't a 64-bit LDR immediate");
-      uint32_t FixedInstr = RawInstr | (TargetOffset << 10);
+
+      uint32_t TargetOffset = E.getTarget().getAddress() & 0xfff;
+      assert((TargetOffset & 0x7) == 0 && "GOT entry is not 8-byte aligned");
+      uint32_t EncodedImm = (TargetOffset >> 3) << 10;
+      uint32_t FixedInstr = RawInstr | EncodedImm;
       *(ulittle32_t *)FixupPtr = FixedInstr;
       break;
     }




More information about the llvm-commits mailing list