summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2015-09-10 21:05:58 +0000
committerLang Hames <lhames@gmail.com>2015-09-10 21:05:58 +0000
commit21a77ba1f7d605d1f4a3af7f3e71774779d832bb (patch)
tree44bf504d72e002d5a68f15e1716b848337c77748 /llvm
parent79fce4711b9e718449b70f394cd9a8fea7534ae2 (diff)
downloadbcm5719-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.h8
-rw-r--r--llvm/test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s4
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:
OpenPOWER on IntegriCloud