diff options
| author | Lang Hames <lhames@gmail.com> | 2015-09-10 21:05:58 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2015-09-10 21:05:58 +0000 |
| commit | 21a77ba1f7d605d1f4a3af7f3e71774779d832bb (patch) | |
| tree | 44bf504d72e002d5a68f15e1716b848337c77748 /llvm | |
| parent | 79fce4711b9e718449b70f394cd9a8fea7534ae2 (diff) | |
| download | bcm5719-llvm-21a77ba1f7d605d1f4a3af7f3e71774779d832bb.tar.gz bcm5719-llvm-21a77ba1f7d605d1f4a3af7f3e71774779d832bb.zip | |
[RuntimeDyld] Support non-zero addends for the MachO X86_64 SUBTRACTOR reloc.
This functionality was accidentally left out of r247119.
llvm-svn: 247336
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h | 8 | ||||
| -rw-r--r-- | llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s | 4 |
2 files changed, 8 insertions, 4 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h index 188e2c65243..8b410972415 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<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(); @@ -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 d47e12eccf0..d5a55b33e64 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: |

