summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp9
-rw-r--r--llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.obin0 -> 704 bytes
-rw-r--r--llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test (renamed from llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test)1
3 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
index 66456a990b7..30529808d0d 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
@@ -573,6 +573,10 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef(
RelType == MachO::X86_64_RELOC_GOT_LOAD)) {
assert(IsPCRel);
assert(Size == 2);
+
+ // FIXME: Teach the generic code above not to prematurely conflate
+ // relocation addends and symbol offsets.
+ Value.Addend -= Addend;
StubMap::const_iterator i = Stubs.find(Value);
uint8_t *Addr;
if (i != Stubs.end()) {
@@ -581,7 +585,8 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef(
Stubs[Value] = Section.StubOffset;
uint8_t *GOTEntry = Section.Address + Section.StubOffset;
RelocationEntry GOTRE(SectionID, Section.StubOffset,
- MachO::X86_64_RELOC_UNSIGNED, 0, false, 3);
+ MachO::X86_64_RELOC_UNSIGNED, Value.Addend, false,
+ 3);
if (Value.SymbolName)
addRelocationForSymbol(GOTRE, Value.SymbolName);
else
@@ -590,7 +595,7 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef(
Addr = GOTEntry;
}
RelocationEntry TargetRE(SectionID, Offset,
- MachO::X86_64_RELOC_UNSIGNED, Value.Addend, true,
+ MachO::X86_64_RELOC_UNSIGNED, Addend, true,
2);
resolveRelocation(TargetRE, (uint64_t)Addr);
} else if (Arch == Triple::arm && (RelType & 0xf) == MachO::ARM_RELOC_BR24) {
diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o b/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o
new file mode 100644
index 00000000000..2013a0e81de
--- /dev/null
+++ b/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o
Binary files differ
diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test b/llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test
index 92e4dd793cc..d3407352ce7 100644
--- a/llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test
+++ b/llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test
@@ -1 +1,2 @@
RUN: llvm-rtdyld -printline %p/Inputs/arm_secdiff_reloc.o
+RUN: llvm-rtdyld %p/Inputs/x86_64_macho_pic_globals_GOT.o
OpenPOWER on IntegriCloud