//===-- RuntimeDyldELF.h - Run-time dynamic linker for MC-JIT ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // ELF support for MC-JIT runtime dynamic linker. // //===----------------------------------------------------------------------===// #ifndef LLVM_RUNTIME_DYLD_ELF_H #define LLVM_RUNTIME_DYLD_ELF_H #include "RuntimeDyldImpl.h" using namespace llvm; namespace llvm { class RuntimeDyldELF : public RuntimeDyldImpl { // For each symbol, keep a list of relocations based on it. Anytime // its address is reassigned (the JIT re-compiled the function, e.g.), // the relocations get re-resolved. struct RelocationEntry { // Function or section this relocation is contained in. std::string Target; // Offset into the target function or section for the relocation. uint32_t Offset; // Relocation type uint32_t Type; // Addend encoded in the instruction itself, if any. int32_t Addend; // Has the relocation been recalcuated as an offset within a function? bool IsFunctionRelative; // Has this relocation been resolved previously? bool isResolved; RelocationEntry(StringRef t, uint32_t offset, uint32_t type, int32_t addend, bool isFunctionRelative) : Target(t) , Offset(offset) , Type(type) , Addend(addend) , IsFunctionRelative(isFunctionRelative) , isResolved(false) { } }; typedef SmallVector RelocationList; StringMap Relocations; unsigned Arch; void resolveRelocations(); void resolveX86_64Relocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveX86Relocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveArmRelocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveRelocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); public: RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} bool loadObject(MemoryBuffer *InputBuffer); void reassignSymbolAddress(StringRef Name, uint8_t *Addr); void reassignSectionAddress(unsigned SectionID, uint64_t Addr); bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const; }; } // end namespace llvm #endif //===-- RuntimeDyldELF.h - Run-time dynamic linker for MC-JIT ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // ELF support for MC-JIT runtime dynamic linker. // //===----------------------------------------------------------------------===// #ifndef LLVM_RUNTIME_DYLD_ELF_H #define LLVM_RUNTIME_DYLD_ELF_H #include "RuntimeDyldImpl.h" using namespace llvm; namespace llvm { class RuntimeDyldELF : public RuntimeDyldImpl { // For each symbol, keep a list of relocations based on it. Anytime // its address is reassigned (the JIT re-compiled the function, e.g.), // the relocations get re-resolved. struct RelocationEntry { // Function or section this relocation is contained in. std::string Target; // Offset into the target function or section for the relocation. uint32_t Offset; // Relocation type uint32_t Type; // Addend encoded in the instruction itself, if any. int32_t Addend; // Has the relocation been recalcuated as an offset within a function? bool IsFunctionRelative; // Has this relocation been resolved previously? bool isResolved; RelocationEntry(StringRef t, uint32_t offset, uint32_t type, int32_t addend, bool isFunctionRelative) : Target(t) , Offset(offset) , Type(type) , Addend(addend) , IsFunctionRelative(isFunctionRelative) , isResolved(false) { } }; typedef SmallVector RelocationList; StringMap Relocations; unsigned Arch; void resolveRelocations(); void resolveX86_64Relocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveX86Relocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveArmRelocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); void resolveRelocation(StringRef Name, uint8_t *Addr, const RelocationEntry &RE); public: RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} bool loadObject(MemoryBuffer *InputBuffer); void reassignSymbolAddress(StringRef Name, uint8_t *Addr); void reassignSectionAddress(unsigned SectionID, uint64_t Addr); bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const; }; } // end namespace llvm #endif