diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h index 188e2c652432..8b4109724154 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h @@ -154,12 +154,17 @@ private: unsigned Size = Obj.getAnyRelocationLength(RE); uint64_t Offset = RelI->getOffset(); + uint8_t *LocalAddress = Sections[SectionID].Address + Offset; + unsigned NumBytes = 1 << Size; + ErrorOr 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 MinuendNameOrErr = RelI->getSymbol()->getName(); @@ -169,8 +174,7 @@ private: 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); diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s b/llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s index d47e12eccf0d..d5a55b33e64e 100644 --- a/llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s +++ b/llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s @@ -58,9 +58,9 @@ z2: .quad ds2 # Test subtractor relocations. -# rtdyld-check: *{8}z3 = z4 - z5 +# rtdyld-check: *{8}z3 = z4 - z5 + 4 z3: - .quad z4 - z5 + .quad z4 - z5 + 4 .section __DATA,_tmp1 z4: