25 lines
930 B
Diff
25 lines
930 B
Diff
Author: A. Wilcox <awilfox@adelielinux.org>
|
|
Upstream-Status: Pending
|
|
|
|
This implements the R_PPC_REL32 relocation type, which is needed for the
|
|
OrcJIT to work properly on 32-bit PowerPC.
|
|
|
|
Needs more tests before submitting upstream, but seems to DTRT.
|
|
|
|
--- llvm-14.0.6.src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp.old 2022-06-22 16:46:24.000000000 +0000
|
|
+++ llvm-14.0.6.src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp 2022-11-28 06:33:12.239921624 +0000
|
|
@@ -830,6 +830,13 @@
|
|
case ELF::R_PPC_ADDR16_HA:
|
|
writeInt16BE(LocalAddress, applyPPCha(Value + Addend));
|
|
break;
|
|
+ case ELF::R_PPC_REL32:
|
|
+ uint32_t FinalAddress = Section.getLoadAddressWithOffset(Offset);
|
|
+ int64_t delta = static_cast<int64_t>(Value - FinalAddress + Addend);
|
|
+ if (SignExtend64<32>(delta) != delta)
|
|
+ llvm_unreachable("Relocation R_PPC_REL32 overflow");
|
|
+ writeInt32BE(LocalAddress, delta);
|
|
+ break;
|
|
}
|
|
}
|
|
|