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. ...
This class represents lattice values for constants.
uint64_t readBytesUnaligned(uint8_t *Src, unsigned Size) const
Endian-aware read Read the least significant Size bytes from Src.
uint64_t getLoadAddressWithOffset(unsigned OffsetBytes) const
Return the load address of this section with an offset.
bool getPlainRelocationExternal(const MachO::any_relocation_info &RE) const
iterator find(StringRef Key)
void dumpRelocationToResolve(const RelocationEntry &RE, uint64_t Value) const
Dump information about the relocation entry (RE) and resolved value.
This class is the base class for all object file types.
unsigned getMaxStubSize() override
Error takeError()
Take ownership of the stored error.
void writeBytesUnaligned(uint64_t Value, uint8_t *Dst, unsigned Size) const
Endian-aware write.
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...
uint64_t getAddress() const
bool isText() const
Whether this section contains instructions.
std::map< RelocationValueRef, uintptr_t > StubMap
Tagged union holding either a T or a Error.
int64_t memcpyAddend(const RelocationEntry &RE) const
This convenience method uses memcpy to extract a contiguous addend (the addend size and offset are ta...
SectionRef getAnyRelocationSection(const MachO::any_relocation_info &RE) const
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 ...
unsigned getAnyRelocationType(const MachO::any_relocation_info &RE) const
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)
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...
void addRelocationForSection(const RelocationEntry &RE, unsigned SectionID)
MachO::any_relocation_info getRelocation(DataRefImpl Rel) const
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Symbol resolution interface.
Expected< unsigned > findOrEmitSection(const ObjectFile &Obj, const SectionRef &Section, bool IsCode, ObjSectionToIDMap &LocalSections)
Find Section in LocalSections.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isRelocationScattered(const MachO::any_relocation_info &RE) const
static ErrorSuccess success()
Create a success value.
int64_t Addend
Addend - the relocation addend encoded in the instruction itself.
uint32_t RelType
RelType - relocation type.
RuntimeDyldMachOX86_64(RuntimeDyld::MemoryManager &MM, JITSymbolResolver &Resolver)
uintptr_t getStubOffset() const
unsigned getAnyRelocationLength(const MachO::any_relocation_info &RE) const
unsigned getStubAlignment() override
uint64_t Offset
Offset - offset into the section.
std::map< SectionRef, unsigned > ObjSectionToIDMap
uint8_t * getAddressWithOffset(unsigned OffsetBytes) const
Return the address of this section with an offset.
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.
This is a value type class that represents a single section in the list of sections in the object fil...