diff options
author | Lang Hames <lhames@gmail.com> | 2014-07-19 00:19:17 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-07-19 00:19:17 +0000 |
commit | 3fda7d81c7bfe5bc61a9009156cbec2fed66aedc (patch) | |
tree | fedf34fd4dce8529457875975d65e33e7facfc75 | |
parent | 1c3d95ebc5fec3ab73fbd300a4321e3213441d52 (diff) | |
download | bcm5719-llvm-3fda7d81c7bfe5bc61a9009156cbec2fed66aedc.tar.gz bcm5719-llvm-3fda7d81c7bfe5bc61a9009156cbec2fed66aedc.zip |
[MCJIT] Add a 'decodeAddend' method to RuntimeDyldMachO and teach
getBasicRelocationEntry to use this rather than 'memcpy' to get the
relocation addend. Targets with non-trivial addend encodings (E.g. AArch64) can
override decodeAddend to handle immediates with interesting encodings.
No functional change.
llvm-svn: 213435
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h | 36 |
2 files changed, 33 insertions, 26 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index d062b10db15..aba67f2e69e 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -27,28 +27,11 @@ using namespace llvm::object; namespace llvm { -RelocationEntry -RuntimeDyldMachO::getBasicRelocationEntry(unsigned SectionID, - ObjectImage &ObjImg, - const relocation_iterator &RI) const { - - const MachOObjectFile &Obj = - static_cast<const MachOObjectFile &>(*ObjImg.getObjectFile()); - MachO::any_relocation_info RelInfo = - Obj.getRelocation(RI->getRawDataRefImpl()); - - const SectionEntry &Section = Sections[SectionID]; - bool IsPCRel = Obj.getAnyRelocationPCRel(RelInfo); - unsigned Size = Obj.getAnyRelocationLength(RelInfo); - uint64_t Offset; - RI->getOffset(Offset); - uint8_t *LocalAddress = Section.Address + Offset; - unsigned NumBytes = 1 << Size; +uint64_t RuntimeDyldMachO::decodeAddend(uint8_t *LocalAddress, unsigned NumBytes, + uint32_t RelType) const { uint64_t Addend = 0; memcpy(&Addend, LocalAddress, NumBytes); - uint32_t RelType = Obj.getAnyRelocationType(RelInfo); - - return RelocationEntry(SectionID, Offset, RelType, Addend, IsPCRel, Size); + return Addend; } RelocationValueRef RuntimeDyldMachO::getRelocationValueRef( diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h index c8642826d4e..7d1dc0263db 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h @@ -51,11 +51,9 @@ protected: RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} - /// Parse the given relocation, which must be a non-scattered, and - /// return a RelocationEntry representing the information. The 'Addend' field - /// will contain the unmodified instruction immediate. - RelocationEntry getBasicRelocationEntry(unsigned SectionID, ObjectImage &Obj, - const relocation_iterator &RI) const; + /// Extract the addend encoded in the instruction. + uint64_t decodeAddend(uint8_t *LocalAddress, unsigned NumBytes, + uint32_t RelType) const; /// Construct a RelocationValueRef representing the relocation target. /// For Symbols in known sections, this will return a RelocationValueRef @@ -117,7 +115,33 @@ template <typename Impl> class RuntimeDyldMachOCRTPBase : public RuntimeDyldMachO { private: Impl &impl() { return static_cast<Impl &>(*this); } - const Impl &impl() const { return static_cast<Impl &>(*this); } + const Impl &impl() const { return static_cast<const Impl &>(*this); } + +protected: + + /// Parse the given relocation, which must be a non-scattered, and + /// return a RelocationEntry representing the information. The 'Addend' field + /// will contain the unmodified instruction immediate. + RelocationEntry getBasicRelocationEntry(unsigned SectionID, + ObjectImage &ObjImg, + const relocation_iterator &RI) const { + const MachOObjectFile &Obj = + static_cast<const MachOObjectFile &>(*ObjImg.getObjectFile()); + MachO::any_relocation_info RelInfo = + Obj.getRelocation(RI->getRawDataRefImpl()); + + const SectionEntry &Section = Sections[SectionID]; + bool IsPCRel = Obj.getAnyRelocationPCRel(RelInfo); + unsigned Size = Obj.getAnyRelocationLength(RelInfo); + uint64_t Offset; + RI->getOffset(Offset); + uint8_t *LocalAddress = Section.Address + Offset; + unsigned NumBytes = 1 << Size; + uint32_t RelType = Obj.getAnyRelocationType(RelInfo); + uint64_t Addend = impl().decodeAddend(LocalAddress, NumBytes, RelType); + + return RelocationEntry(SectionID, Offset, RelType, Addend, IsPCRel, Size); + } public: RuntimeDyldMachOCRTPBase(RTDyldMemoryManager *mm) : RuntimeDyldMachO(mm) {} |