diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp')
| -rw-r--r-- | llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp index a1bc4c853323..132989fcbce0 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp @@ -17,7 +17,6 @@ #include "llvm/ExecutionEngine/JITLink/aarch32.h" #include "llvm/Object/ELF.h" #include "llvm/Object/ELFObjectFile.h" -#include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/TargetParser/ARMTargetParser.h" @@ -40,6 +39,12 @@ Expected<aarch32::EdgeKind_aarch32> getJITLinkEdgeKind(uint32_t ELFType) { return aarch32::Data_Delta32; case ELF::R_ARM_CALL: return aarch32::Arm_Call; + case ELF::R_ARM_JUMP24: + return aarch32::Arm_Jump24; + case ELF::R_ARM_MOVW_ABS_NC: + return aarch32::Arm_MovwAbsNC; + case ELF::R_ARM_MOVT_ABS: + return aarch32::Arm_MovtAbs; case ELF::R_ARM_THM_CALL: return aarch32::Thumb_Call; case ELF::R_ARM_THM_JUMP24: @@ -48,6 +53,10 @@ Expected<aarch32::EdgeKind_aarch32> getJITLinkEdgeKind(uint32_t ELFType) { return aarch32::Thumb_MovwAbsNC; case ELF::R_ARM_THM_MOVT_ABS: return aarch32::Thumb_MovtAbs; + case ELF::R_ARM_THM_MOVW_PREL_NC: + return aarch32::Thumb_MovwPrelNC; + case ELF::R_ARM_THM_MOVT_PREL: + return aarch32::Thumb_MovtPrel; } return make_error<JITLinkError>( @@ -64,6 +73,12 @@ Expected<uint32_t> getELFRelocationType(Edge::Kind Kind) { return ELF::R_ARM_ABS32; case aarch32::Arm_Call: return ELF::R_ARM_CALL; + case aarch32::Arm_Jump24: + return ELF::R_ARM_JUMP24; + case aarch32::Arm_MovwAbsNC: + return ELF::R_ARM_MOVW_ABS_NC; + case aarch32::Arm_MovtAbs: + return ELF::R_ARM_MOVT_ABS; case aarch32::Thumb_Call: return ELF::R_ARM_THM_CALL; case aarch32::Thumb_Jump24: @@ -72,6 +87,10 @@ Expected<uint32_t> getELFRelocationType(Edge::Kind Kind) { return ELF::R_ARM_THM_MOVW_ABS_NC; case aarch32::Thumb_MovtAbs: return ELF::R_ARM_THM_MOVT_ABS; + case aarch32::Thumb_MovwPrelNC: + return ELF::R_ARM_THM_MOVW_PREL_NC; + case aarch32::Thumb_MovtPrel: + return ELF::R_ARM_THM_MOVT_PREL; } return make_error<JITLinkError>(formatv("Invalid aarch32 edge {0:d}: ", @@ -102,7 +121,7 @@ private: } }; -template <support::endianness DataEndianness> +template <llvm::endianness DataEndianness> class ELFLinkGraphBuilder_aarch32 : public ELFLinkGraphBuilder<ELFType<DataEndianness, false>> { private: @@ -154,14 +173,13 @@ private: auto FixupAddress = orc::ExecutorAddr(FixupSect.sh_addr) + Rel.r_offset; Edge::OffsetT Offset = FixupAddress - BlockToFix.getAddress(); - Edge E(*Kind, Offset, *GraphSymbol, 0); Expected<int64_t> Addend = - aarch32::readAddend(*Base::G, BlockToFix, E, ArmCfg); + aarch32::readAddend(*Base::G, BlockToFix, Offset, *Kind, ArmCfg); if (!Addend) return Addend.takeError(); - E.setAddend(*Addend); + Edge E(*Kind, Offset, *GraphSymbol, *Addend); LLVM_DEBUG({ dbgs() << " "; printEdge(dbgs(), BlockToFix, E, getELFAArch32EdgeKindName(*Kind)); @@ -253,7 +271,7 @@ createLinkGraphFromELFObject_aarch32(MemoryBufferRef ObjectBuffer) { case Triple::arm: case Triple::thumb: { auto &ELFFile = cast<ELFObjectFile<ELF32LE>>(**ELFObj).getELFFile(); - return ELFLinkGraphBuilder_aarch32<support::little>( + return ELFLinkGraphBuilder_aarch32<llvm::endianness::little>( (*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features), ArmCfg) .buildGraph(); @@ -261,7 +279,7 @@ createLinkGraphFromELFObject_aarch32(MemoryBufferRef ObjectBuffer) { case Triple::armeb: case Triple::thumbeb: { auto &ELFFile = cast<ELFObjectFile<ELF32BE>>(**ELFObj).getELFFile(); - return ELFLinkGraphBuilder_aarch32<support::big>( + return ELFLinkGraphBuilder_aarch32<llvm::endianness::big>( (*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features), ArmCfg) .buildGraph(); |
