diff options
author | Lang Hames <lhames@gmail.com> | 2019-08-03 20:17:10 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2019-08-03 20:17:10 +0000 |
commit | 3daccaac8a6b261eaedf76e6eac6011295b08d7e (patch) | |
tree | eb1fb1d915a3df96e9ab2c7bcb7fcfa8ce92b045 /llvm/lib/ExecutionEngine | |
parent | b31229af4f4a5aa3c0a14b38341d449f8e988242 (diff) | |
download | bcm5719-llvm-3daccaac8a6b261eaedf76e6eac6011295b08d7e.tar.gz bcm5719-llvm-3daccaac8a6b261eaedf76e6eac6011295b08d7e.zip |
[JITLink] Add support for MachO/x86-64 UNSIGNED relocs with length=2.
MachO/x86-64 UNSIGNED relocs are almost always 64-bit (length=3), but UNSIGNED
relocs of length=2 are allowed if the target resides in the low 32-bits. This
patch adds support for such relocations in JITLink (previously they would have
triggered an unsupported relocation error).
llvm-svn: 367764
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r-- | llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp index 6b2b39248a0..52481f8436e 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp @@ -40,8 +40,12 @@ private: getRelocationKind(const MachO::relocation_info &RI) { switch (RI.r_type) { case MachO::X86_64_RELOC_UNSIGNED: - if (!RI.r_pcrel && RI.r_length == 3) - return RI.r_extern ? Pointer64 : Pointer64Anon; + if (!RI.r_pcrel) { + if (RI.r_length == 3) + return RI.r_extern ? Pointer64 : Pointer64Anon; + else if (RI.r_extern && RI.r_length == 2) + return Pointer32; + } break; case MachO::X86_64_RELOC_SIGNED: if (RI.r_pcrel && RI.r_length == 2) @@ -260,6 +264,13 @@ private: return TargetAtomOrErr.takeError(); Addend = *(const ulittle32_t *)FixupContent; break; + case Pointer32: + if (auto TargetAtomOrErr = findAtomBySymbolIndex(RI)) + TargetAtom = &*TargetAtomOrErr; + else + return TargetAtomOrErr.takeError(); + Addend = *(const ulittle32_t *)FixupContent; + break; case Pointer64: if (auto TargetAtomOrErr = findAtomBySymbolIndex(RI)) TargetAtom = &*TargetAtomOrErr; @@ -526,6 +537,13 @@ private: *(little64_t *)FixupPtr = Value; break; } + case Pointer32: { + uint64_t Value = E.getTarget().getAddress() + E.getAddend(); + if (Value > std::numeric_limits<uint32_t>::max()) + return targetOutOfRangeError(A, E); + *(ulittle32_t *)FixupPtr = Value; + break; + } default: llvm_unreachable("Unrecognized edge kind"); } @@ -565,6 +583,8 @@ StringRef getMachOX86RelocationKindName(Edge::Kind R) { switch (R) { case Branch32: return "Branch32"; + case Pointer32: + return "Pointer32"; case Pointer64: return "Pointer64"; case Pointer64Anon: |