forked from OSchip/llvm-project
[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
This commit is contained in:
parent
1c3d95ebc5
commit
3fda7d81c7
|
@ -27,28 +27,11 @@ using namespace llvm::object;
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
RelocationEntry
|
uint64_t RuntimeDyldMachO::decodeAddend(uint8_t *LocalAddress, unsigned NumBytes,
|
||||||
RuntimeDyldMachO::getBasicRelocationEntry(unsigned SectionID,
|
uint32_t RelType) const {
|
||||||
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 Addend = 0;
|
uint64_t Addend = 0;
|
||||||
memcpy(&Addend, LocalAddress, NumBytes);
|
memcpy(&Addend, LocalAddress, NumBytes);
|
||||||
uint32_t RelType = Obj.getAnyRelocationType(RelInfo);
|
return Addend;
|
||||||
|
|
||||||
return RelocationEntry(SectionID, Offset, RelType, Addend, IsPCRel, Size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RelocationValueRef RuntimeDyldMachO::getRelocationValueRef(
|
RelocationValueRef RuntimeDyldMachO::getRelocationValueRef(
|
||||||
|
|
|
@ -51,11 +51,9 @@ protected:
|
||||||
|
|
||||||
RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
|
RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
|
||||||
|
|
||||||
/// Parse the given relocation, which must be a non-scattered, and
|
/// Extract the addend encoded in the instruction.
|
||||||
/// return a RelocationEntry representing the information. The 'Addend' field
|
uint64_t decodeAddend(uint8_t *LocalAddress, unsigned NumBytes,
|
||||||
/// will contain the unmodified instruction immediate.
|
uint32_t RelType) const;
|
||||||
RelocationEntry getBasicRelocationEntry(unsigned SectionID, ObjectImage &Obj,
|
|
||||||
const relocation_iterator &RI) const;
|
|
||||||
|
|
||||||
/// Construct a RelocationValueRef representing the relocation target.
|
/// Construct a RelocationValueRef representing the relocation target.
|
||||||
/// For Symbols in known sections, this will return a RelocationValueRef
|
/// For Symbols in known sections, this will return a RelocationValueRef
|
||||||
|
@ -117,7 +115,33 @@ template <typename Impl>
|
||||||
class RuntimeDyldMachOCRTPBase : public RuntimeDyldMachO {
|
class RuntimeDyldMachOCRTPBase : public RuntimeDyldMachO {
|
||||||
private:
|
private:
|
||||||
Impl &impl() { return static_cast<Impl &>(*this); }
|
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:
|
public:
|
||||||
RuntimeDyldMachOCRTPBase(RTDyldMemoryManager *mm) : RuntimeDyldMachO(mm) {}
|
RuntimeDyldMachOCRTPBase(RTDyldMemoryManager *mm) : RuntimeDyldMachO(mm) {}
|
||||||
|
|
Loading…
Reference in New Issue