[llvm] d3df7b1 - [JITLink][ELF][x86-64] Don't use intermediate edge-kinds in ELF/x86-64 backend.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 15 10:50:48 PDT 2023
Author: Lang Hames
Date: 2023-04-15T17:49:38Z
New Revision: d3df7b1568e72b3f2e99b858f4457f2729368c15
URL: https://github.com/llvm/llvm-project/commit/d3df7b1568e72b3f2e99b858f4457f2729368c15
DIFF: https://github.com/llvm/llvm-project/commit/d3df7b1568e72b3f2e99b858f4457f2729368c15.diff
LOG: [JITLink][ELF][x86-64] Don't use intermediate edge-kinds in ELF/x86-64 backend.
The mapping from ELF relocation types to JITLink x86-64 edge kinds is 1-1, so
we don't need the intermediate step.
Added:
Modified:
llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
index 375553825dedd..fe9675b390230 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -104,57 +104,6 @@ class ELFLinkGraphBuilder_x86_64 : public ELFLinkGraphBuilder<object::ELF64LE> {
private:
using ELFT = object::ELF64LE;
- enum ELFX86RelocationKind : Edge::Kind {
- Branch32 = Edge::FirstRelocation,
- Pointer32,
- Pointer32Signed,
- Pointer64,
- PCRel32,
- PCRel32GOTLoad,
- PCRel32GOTLoadRelaxable,
- PCRel32REXGOTLoadRelaxable,
- PCRel32TLV,
- PCRel64GOT,
- GOTOFF64,
- GOT64,
- Delta64,
- };
-
- static Expected<ELFX86RelocationKind> getRelocationKind(const uint32_t Type) {
- switch (Type) {
- case ELF::R_X86_64_32:
- return ELFX86RelocationKind::Pointer32;
- case ELF::R_X86_64_32S:
- return ELFX86RelocationKind::Pointer32Signed;
- case ELF::R_X86_64_PC32:
- return ELFX86RelocationKind::PCRel32;
- case ELF::R_X86_64_PC64:
- case ELF::R_X86_64_GOTPC64:
- return ELFX86RelocationKind::Delta64;
- case ELF::R_X86_64_64:
- return ELFX86RelocationKind::Pointer64;
- case ELF::R_X86_64_GOTPCREL:
- return ELFX86RelocationKind::PCRel32GOTLoad;
- case ELF::R_X86_64_GOTPCRELX:
- return ELFX86RelocationKind::PCRel32GOTLoadRelaxable;
- case ELF::R_X86_64_REX_GOTPCRELX:
- return ELFX86RelocationKind::PCRel32REXGOTLoadRelaxable;
- case ELF::R_X86_64_GOTPCREL64:
- return ELFX86RelocationKind::PCRel64GOT;
- case ELF::R_X86_64_GOT64:
- return ELFX86RelocationKind::GOT64;
- case ELF::R_X86_64_GOTOFF64:
- return ELFX86RelocationKind::GOTOFF64;
- case ELF::R_X86_64_PLT32:
- return ELFX86RelocationKind::Branch32;
- case ELF::R_X86_64_TLSGD:
- return ELFX86RelocationKind::PCRel32TLV;
- }
- return make_error<JITLinkError>(
- "Unsupported x86-64 relocation type " + formatv("{0:d}: ", Type) +
- object::getELFRelocationTypeName(ELF::EM_X86_64, Type));
- }
-
Error addRelocations() override {
LLVM_DEBUG(dbgs() << "Processing relocations:\n");
@@ -195,65 +144,60 @@ class ELFLinkGraphBuilder_x86_64 : public ELFLinkGraphBuilder<object::ELF64LE> {
inconvertibleErrorCode());
// Validate the relocation kind.
- auto ELFRelocKind = getRelocationKind(Rel.getType(false));
- if (!ELFRelocKind)
- return ELFRelocKind.takeError();
-
int64_t Addend = Rel.r_addend;
Edge::Kind Kind = Edge::Invalid;
- switch (*ELFRelocKind) {
- case PCRel32:
+
+ auto ELFReloc = Rel.getType(false);
+ switch (ELFReloc) {
+ case ELF::R_X86_64_PC32:
Kind = x86_64::Delta32;
break;
- case Delta64:
+ case ELF::R_X86_64_PC64:
+ case ELF::R_X86_64_GOTPC64:
Kind = x86_64::Delta64;
break;
- case Pointer32:
+ case ELF::R_X86_64_32:
Kind = x86_64::Pointer32;
break;
- case Pointer32Signed:
+ case ELF::R_X86_64_32S:
Kind = x86_64::Pointer32Signed;
break;
- case Pointer64:
+ case ELF::R_X86_64_64:
Kind = x86_64::Pointer64;
break;
- case PCRel32GOTLoad: {
+ case ELF::R_X86_64_GOTPCREL:
Kind = x86_64::RequestGOTAndTransformToDelta32;
break;
- }
- case PCRel32REXGOTLoadRelaxable: {
+ case ELF::R_X86_64_REX_GOTPCRELX:
Kind = x86_64::RequestGOTAndTransformToPCRel32GOTLoadREXRelaxable;
Addend = 0;
break;
- }
- case PCRel32TLV: {
+ case ELF::R_X86_64_TLSGD:
Kind = x86_64::RequestTLSDescInGOTAndTransformToDelta32;
break;
- }
- case PCRel32GOTLoadRelaxable: {
+ case ELF::R_X86_64_GOTPCRELX:
Kind = x86_64::RequestGOTAndTransformToPCRel32GOTLoadRelaxable;
Addend = 0;
break;
- }
- case PCRel64GOT: {
+ case ELF::R_X86_64_GOTPCREL64:
Kind = x86_64::RequestGOTAndTransformToDelta64;
break;
- }
- case GOT64: {
+ case ELF::R_X86_64_GOT64:
Kind = x86_64::RequestGOTAndTransformToDelta64FromGOT;
break;
- }
- case GOTOFF64: {
+ case ELF::R_X86_64_GOTOFF64:
Kind = x86_64::Delta64FromGOT;
break;
- }
- case Branch32: {
+ case ELF::R_X86_64_PLT32:
Kind = x86_64::BranchPCRel32;
// BranchPCRel32 implicitly handles the '-4' PC adjustment, so we have to
// adjust the addend by '+4' to compensate.
Addend += 4;
break;
- }
+ default:
+ return make_error<JITLinkError>(
+ "In " + G->getName() + ": Unsupported x86-64 relocation type " +
+ object::getELFRelocationTypeName(ELF::EM_X86_64, ELFReloc));
}
auto FixupAddress = orc::ExecutorAddr(FixupSection.sh_addr) + Rel.r_offset;
More information about the llvm-commits
mailing list