Home | History | Annotate | Download | only in RuntimeDyld
      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