[RuntimeDyld] Support non-zero addends for the MachO X86_64 SUBTRACTOR reloc.
authorLang Hames <lhames@gmail.com>
Thu, 10 Sep 2015 21:05:58 +0000 (21:05 +0000)
committerLang Hames <lhames@gmail.com>
Thu, 10 Sep 2015 21:05:58 +0000 (21:05 +0000)
This functionality was accidentally left out of r247119.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247336 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h
test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s

index 188e2c652432a117fa93cf4ec8ca910b694dfde0..8b4109724154a0b438b17b4133cc10695befa231 100644 (file)
@@ -154,12 +154,17 @@ private:
 
     unsigned Size = Obj.getAnyRelocationLength(RE);
     uint64_t Offset = RelI->getOffset();
 
     unsigned Size = Obj.getAnyRelocationLength(RE);
     uint64_t Offset = RelI->getOffset();
+    uint8_t *LocalAddress = Sections[SectionID].Address + Offset;
+    unsigned NumBytes = 1 << Size;
+
     ErrorOr<StringRef> SubtrahendNameOrErr = RelI->getSymbol()->getName();
     if (auto EC = SubtrahendNameOrErr.getError())
       report_fatal_error(EC.message());
     auto SubtrahendI = GlobalSymbolTable.find(*SubtrahendNameOrErr);
     unsigned SectionBID = SubtrahendI->second.getSectionID();
     uint64_t SectionBOffset = SubtrahendI->second.getOffset();
     ErrorOr<StringRef> SubtrahendNameOrErr = RelI->getSymbol()->getName();
     if (auto EC = SubtrahendNameOrErr.getError())
       report_fatal_error(EC.message());
     auto SubtrahendI = GlobalSymbolTable.find(*SubtrahendNameOrErr);
     unsigned SectionBID = SubtrahendI->second.getSectionID();
     uint64_t SectionBOffset = SubtrahendI->second.getOffset();
+    int64_t Addend =
+      SignExtend64(readBytesUnaligned(LocalAddress, NumBytes), NumBytes * 8);
 
     ++RelI;
     ErrorOr<StringRef> MinuendNameOrErr = RelI->getSymbol()->getName();
 
     ++RelI;
     ErrorOr<StringRef> MinuendNameOrErr = RelI->getSymbol()->getName();
@@ -169,8 +174,7 @@ private:
     unsigned SectionAID = MinuendI->second.getSectionID();
     uint64_t SectionAOffset = MinuendI->second.getOffset();
 
     unsigned SectionAID = MinuendI->second.getSectionID();
     uint64_t SectionAOffset = MinuendI->second.getOffset();
 
-    uint64_t Addend = SectionAOffset - SectionBOffset;
-    RelocationEntry R(SectionID, Offset, MachO::X86_64_RELOC_SUBTRACTOR, Addend,
+    RelocationEntry R(SectionID, Offset, MachO::X86_64_RELOC_SUBTRACTOR, (uint64_t)Addend,
                       SectionAID, SectionAOffset, SectionBID, SectionBOffset,
                       false, Size);
 
                       SectionAID, SectionAOffset, SectionBID, SectionBOffset,
                       false, Size);
 
index d47e12eccf0d9201b64963d37bddf600dc6cedc1..d5a55b33e64e3e01a6d4a44dd83afa8915b66c75 100644 (file)
@@ -58,9 +58,9 @@ z2:
         .quad   ds2
 
 # Test subtractor relocations.
         .quad   ds2
 
 # Test subtractor relocations.
-# rtdyld-check: *{8}z3 = z4 - z5
+# rtdyld-check: *{8}z3 = z4 - z5 + 4
 z3:
 z3:
-        .quad  z4 - z5
+        .quad  z4 - z5 + 4
 
         .section        __DATA,_tmp1
 z4:
 
         .section        __DATA,_tmp1
 z4: