10 #ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_TARGETS_RUNTIMEDYLDMACHOX86_64_H
11 #define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_TARGETS_RUNTIMEDYLDMACHOX86_64_H
13 #include "../RuntimeDyldMachO.h"
16 #define DEBUG_TYPE "dyld"
46 return processSubtractRelocation(SectionID, RelI, Obj, ObjSectionToID);
49 "Scattered relocations not supported on X86_64");
57 return ValueOrErr.takeError();
60 if (!IsExtern && RE.IsPCRel)
67 return make_error<RuntimeDyldError>((
"MachO X86_64 relocation type " +
69 " is out of range").str());
75 processGOTRelocation(RE, Value, Stubs);
98 Value -= FinalAddress + 4;
115 assert((Value == SectionABase || Value == SectionBBase) &&
116 "Unexpected SUBTRACTOR relocation value.");
117 Value = SectionABase - SectionBBase + RE.
Addend;
136 RuntimeDyldMachO::StubMap::const_iterator
i = Stubs.find(Value);
138 if (i != Stubs.end()) {
168 uint64_t
Offset = RelI->getOffset();
169 uint8_t *LocalAddress =
Sections[SectionID].getAddressWithOffset(Offset);
170 unsigned NumBytes = 1 << Size;
174 unsigned SectionBID = ~0U;
175 uint64_t SectionBOffset = 0;
184 if (!SubtrahendNameOrErr)
187 SectionBID = SubtrahendI->second.getSectionID();
188 SectionBOffset = SubtrahendI->second.getOffset();
191 bool IsCode = SecB.
isText();
194 if (!SectionBIDOrErr)
196 SectionBID = *SectionBIDOrErr;
202 unsigned SectionAID = ~0U;
203 uint64_t SectionAOffset = 0;
210 if (!MinuendNameOrErr)
213 SectionAID = MinuendI->second.getSectionID();
214 SectionAOffset = MinuendI->second.getOffset();
217 bool IsCode = SecA.
isText();
220 if (!SectionAIDOrErr)
222 SectionAID = *SectionAIDOrErr;
227 SectionAID, SectionAOffset, SectionBID, SectionBOffset,
RelocationEntry - used to represent relocations internally in the dynamic linker. ...
bool getPlainRelocationExternal(const MachO::any_relocation_info &RE) const
void writeBytesUnaligned(uint64_t Value, uint8_t *Dst, unsigned Size) const
Endian-aware write.
unsigned getAnyRelocationType(const MachO::any_relocation_info &RE) const
iterator find(StringRef Key)
This class is the base class for all object file types.
unsigned getMaxStubSize() override
Error takeError()
Take ownership of the stored error.
bool IsPCRel
True if this is a PCRel relocation (MachO specific).
unsigned SectionID
SectionID - the section this relocation points to.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
RelocationEntry getRelocationEntry(unsigned SectionID, const ObjectFile &BaseTObj, const relocation_iterator &RI) const
Given a relocation_iterator for a non-scattered relocation, construct a RelocationEntry and fill in t...
int64_t memcpyAddend(const RelocationEntry &RE) const
This convenience method uses memcpy to extract a contiguous addend (the addend size and offset are ta...
std::map< RelocationValueRef, uintptr_t > StubMap
Tagged union holding either a T or a Error.
uint64_t getLoadAddressWithOffset(unsigned OffsetBytes) const
Return the load address of this section with an offset.
Expected< relocation_iterator > processRelocationRef(unsigned SectionID, relocation_iterator RelI, const ObjectFile &BaseObjT, ObjSectionToIDMap &ObjSectionToID, StubMap &Stubs) override
Parses one or more object file relocations (some object files use relocation pairs) and stores it to ...
void dumpRelocationToResolve(const RelocationEntry &RE, uint64_t Value) const
Dump information about the relocation entry (RE) and resolved value.
RuntimeDyldMachOTarget - Templated base class for generic MachO linker algorithms and data structures...
Error finalizeSection(const ObjectFile &Obj, unsigned SectionID, const SectionRef &Section)
Expected< RelocationValueRef > getRelocationValueRef(const ObjectFile &BaseTObj, const relocation_iterator &RI, const RelocationEntry &RE, ObjSectionToIDMap &ObjSectionToID)
Construct a RelocationValueRef representing the relocation target.
void addRelocationForSymbol(const RelocationEntry &RE, StringRef SymbolName)
uint8_t * getAddressWithOffset(unsigned OffsetBytes) const
Return the address of this section with an offset.
MachO::any_relocation_info getRelocation(DataRefImpl Rel) const
void addRelocationForSection(const RelocationEntry &RE, unsigned SectionID)
uint64_t readBytesUnaligned(uint8_t *Src, unsigned Size) const
Endian-aware read Read the least significant Size bytes from Src.
uintptr_t getStubOffset() const
Expected< unsigned > findOrEmitSection(const ObjectFile &Obj, const SectionRef &Section, bool IsCode, ObjSectionToIDMap &LocalSections)
Find Section in LocalSections.
uint64_t getAddress() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static ErrorSuccess success()
Create a success value.
unsigned getAnyRelocationLength(const MachO::any_relocation_info &RE) const
int64_t Addend
Addend - the relocation addend encoded in the instruction itself.
uint32_t RelType
RelType - relocation type.
JITSymbolResolver & Resolver
RuntimeDyldMachOX86_64(RuntimeDyld::MemoryManager &MM, JITSymbolResolver &Resolver)
SectionRef getAnyRelocationSection(const MachO::any_relocation_info &RE) const
unsigned getStubAlignment() override
uint64_t Offset
Offset - offset into the section.
std::map< SectionRef, unsigned > ObjSectionToIDMap
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
void resolveRelocation(const RelocationEntry &RE, uint64_t Value) override
A object file specific relocation resolver.
SectionEntry - represents a section emitted into memory by the dynamic linker.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
RTDyldSymbolTable GlobalSymbolTable
Lightweight error class with error context and mandatory checking.
unsigned Size
The size of this relocation (MachO specific).
#define UNIMPLEMENTED_RELOC(RelType)
void advanceStubOffset(unsigned StubSize)
void makeValueAddendPCRel(RelocationValueRef &Value, const relocation_iterator &RI, unsigned OffsetToNextPC)
Make the RelocationValueRef addend PC-relative.
bool isRelocationScattered(const MachO::any_relocation_info &RE) const
This is a value type class that represents a single section in the list of sections in the object fil...