summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2014-07-19 00:19:17 +0000
committerLang Hames <lhames@gmail.com>2014-07-19 00:19:17 +0000
commit3fda7d81c7bfe5bc61a9009156cbec2fed66aedc (patch)
treefedf34fd4dce8529457875975d65e33e7facfc75
parent1c3d95ebc5fec3ab73fbd300a4321e3213441d52 (diff)
downloadbcm5719-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.cpp23
-rw-r--r--llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h36
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) {}
OpenPOWER on IntegriCloud