From: Lang Hames Date: Thu, 10 Sep 2015 21:05:58 +0000 (+0000) Subject: [RuntimeDyld] Support non-zero addends for the MachO X86_64 SUBTRACTOR reloc. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=b56b4c0b45bd6ad06944597e67e0d9d1358d1762 [RuntimeDyld] Support non-zero addends for the MachO X86_64 SUBTRACTOR reloc. 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 --- diff --git a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h index 188e2c65243..8b410972415 100644 --- a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h +++ b/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/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s b/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s index d47e12eccf0..d5a55b33e64 100644 --- a/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s +++ b/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: