1 //===-- RuntimeDyldELF.h - Run-time dynamic linker for MC-JIT ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // ELF support for MC-JIT runtime dynamic linker. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_RUNTIME_DYLD_ELF_H 15 #define LLVM_RUNTIME_DYLD_ELF_H 16 17 #include "RuntimeDyldImpl.h" 18 19 using namespace llvm; 20 21 namespace llvm { 22 23 namespace { 24 // Helper for extensive error checking in debug builds. Check(error_code Err)25 error_code Check(error_code Err) { 26 if (Err) { 27 report_fatal_error(Err.message()); 28 } 29 return Err; 30 } 31 } // end anonymous namespace 32 33 class RuntimeDyldELF : public RuntimeDyldImpl { 34 void resolveRelocation(const SectionEntry &Section, 35 uint64_t Offset, 36 uint64_t Value, 37 uint32_t Type, 38 int64_t Addend); 39 40 void resolveX86_64Relocation(const SectionEntry &Section, 41 uint64_t Offset, 42 uint64_t Value, 43 uint32_t Type, 44 int64_t Addend); 45 46 void resolveX86Relocation(const SectionEntry &Section, 47 uint64_t Offset, 48 uint32_t Value, 49 uint32_t Type, 50 int32_t Addend); 51 52 void resolveAArch64Relocation(const SectionEntry &Section, 53 uint64_t Offset, 54 uint64_t Value, 55 uint32_t Type, 56 int64_t Addend); 57 58 void resolveARMRelocation(const SectionEntry &Section, 59 uint64_t Offset, 60 uint32_t Value, 61 uint32_t Type, 62 int32_t Addend); 63 64 void resolveMIPSRelocation(const SectionEntry &Section, 65 uint64_t Offset, 66 uint32_t Value, 67 uint32_t Type, 68 int32_t Addend); 69 70 void resolvePPC64Relocation(const SectionEntry &Section, 71 uint64_t Offset, 72 uint64_t Value, 73 uint32_t Type, 74 int64_t Addend); 75 76 void resolveSystemZRelocation(const SectionEntry &Section, 77 uint64_t Offset, 78 uint64_t Value, 79 uint32_t Type, 80 int64_t Addend); 81 82 uint64_t findPPC64TOC() const; 83 void findOPDEntrySection(ObjectImage &Obj, 84 ObjSectionToIDMap &LocalSections, 85 RelocationValueRef &Rel); 86 87 public: RuntimeDyldELF(RTDyldMemoryManager * mm)88 RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {} 89 90 virtual void resolveRelocation(const RelocationEntry &RE, uint64_t Value); 91 virtual void processRelocationRef(unsigned SectionID, 92 RelocationRef RelI, 93 ObjectImage &Obj, 94 ObjSectionToIDMap &ObjSectionToID, 95 const SymbolTableMap &Symbols, 96 StubMap &Stubs); 97 virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const; 98 virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer); 99 virtual StringRef getEHFrameSection(); 100 virtual ~RuntimeDyldELF(); 101 }; 102 103 } // end namespace llvm 104 105 #endif 106