summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2019-08-03 20:17:10 +0000
committerLang Hames <lhames@gmail.com>2019-08-03 20:17:10 +0000
commit3daccaac8a6b261eaedf76e6eac6011295b08d7e (patch)
treeeb1fb1d915a3df96e9ab2c7bcb7fcfa8ce92b045 /llvm/lib/ExecutionEngine
parentb31229af4f4a5aa3c0a14b38341d449f8e988242 (diff)
downloadbcm5719-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.cpp24
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:
OpenPOWER on IntegriCloud