diff options
author | Lang Hames <lhames@gmail.com> | 2014-10-21 23:41:15 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-10-21 23:41:15 +0000 |
commit | 41d95947cfc4b143cd0ca922e93cc582a6d10e96 (patch) | |
tree | 90ab43c53b594ccb692875be15411ab97fb67c97 | |
parent | 915fbb35901d21fd2e8234e6274738e085c16925 (diff) | |
download | bcm5719-llvm-41d95947cfc4b143cd0ca922e93cc582a6d10e96.tar.gz bcm5719-llvm-41d95947cfc4b143cd0ca922e93cc582a6d10e96.zip |
[MCJIT] Defer application of AArch64 MachO GOT relocations until resolve time.
On AArch64, GOT references are page relative (ADRP + LDR), so they can't be
applied until we know exactly where, within a page, the GOT entry will be in
the target address space.
Fixes <rdar://problem/18693976>.
llvm-svn: 220347
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h | 10 | ||||
-rw-r--r-- | llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s | 2 |
2 files changed, 6 insertions, 6 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h index 980daaaf625..f5cf9ac29bf 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h @@ -368,9 +368,9 @@ private: assert(RE.Size == 2); SectionEntry &Section = Sections[RE.SectionID]; StubMap::const_iterator i = Stubs.find(Value); - uintptr_t Addr; + int64_t Offset; if (i != Stubs.end()) - Addr = reinterpret_cast<uintptr_t>(Section.Address) + i->second; + Offset = static_cast<int64_t>(i->second); else { // FIXME: There must be a better way to do this then to check and fix the // alignment every time!!! @@ -391,11 +391,11 @@ private: else addRelocationForSection(GOTRE, Value.SectionID); Section.StubOffset = StubOffset + getMaxStubSize(); - Addr = StubAddress; + Offset = static_cast<int64_t>(StubOffset); } - RelocationEntry TargetRE(RE.SectionID, RE.Offset, RE.RelType, /*Addend=*/0, + RelocationEntry TargetRE(RE.SectionID, RE.Offset, RE.RelType, Offset, RE.IsPCRel, RE.Size); - resolveRelocation(TargetRE, static_cast<uint64_t>(Addr)); + addRelocationForSection(TargetRE, RE.SectionID); } }; } diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s b/llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s index 29c95e6ce35..04d269e2aeb 100644 --- a/llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s +++ b/llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s @@ -1,5 +1,5 @@ # RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -code-model=small -relocation-model=pic -filetype=obj -o %T/foo.o %s -# RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -verify -check=%s %/T/foo.o +# RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -map-section foo.o,__text=0x10bc0 -verify -check=%s %/T/foo.o .section __TEXT,__text,regular,pure_instructions .ios_version_min 7, 0 |