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. 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 protected: 35 void resolveX86_64Relocation(const SectionEntry &Section, 36 uint64_t Offset, 37 uint64_t Value, 38 uint32_t Type, 39 int64_t Addend); 40 41 void resolveX86Relocation(const SectionEntry &Section, 42 uint64_t Offset, 43 uint32_t Value, 44 uint32_t Type, 45 int32_t Addend); 46 47 void resolveARMRelocation(const SectionEntry &Section, 48 uint64_t Offset, 49 uint32_t Value, 50 uint32_t Type, 51 int32_t Addend); 52 53 void resolveMIPSRelocation(const SectionEntry &Section, 54 uint64_t Offset, 55 uint32_t Value, 56 uint32_t Type, 57 int32_t Addend); 58 59 void resolvePPC64Relocation(const SectionEntry &Section, 60 uint64_t Offset, 61 uint64_t Value, 62 uint32_t Type, 63 int64_t Addend); 64 65 virtual void resolveRelocation(const SectionEntry &Section, 66 uint64_t Offset, 67 uint64_t Value, 68 uint32_t Type, 69 int64_t Addend); 70 71 virtual void processRelocationRef(const ObjRelocationInfo &Rel, 72 ObjectImage &Obj, 73 ObjSectionToIDMap &ObjSectionToID, 74 const SymbolTableMap &Symbols, 75 StubMap &Stubs); 76 77 unsigned getCommonSymbolAlignment(const SymbolRef &Sym); 78 79 virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer); 80 81 uint64_t findPPC64TOC() const; 82 void findOPDEntrySection(ObjectImage &Obj, 83 ObjSectionToIDMap &LocalSections, 84 RelocationValueRef &Rel); 85 86 public: 87 RuntimeDyldELF(RTDyldMemoryManager *mm) 88 : RuntimeDyldImpl(mm) {} 89 90 virtual ~RuntimeDyldELF(); 91 92 bool isCompatibleFormat(const ObjectBuffer *Buffer) const; 93 }; 94 95 } // end namespace llvm 96 97 #endif 98