cbdc0dbc6b734f79ba08a5481f60034451ab1c4d
[oota-llvm.git] / lib / ExecutionEngine / RuntimeDyld / RuntimeDyldELF.h
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(uint8_t *LocalAddress,
36                                uint64_t FinalAddress,
37                                uint64_t Value,
38                                uint32_t Type,
39                                int64_t Addend);
40
41   void resolveX86Relocation(uint8_t *LocalAddress,
42                             uint32_t FinalAddress,
43                             uint32_t Value,
44                             uint32_t Type,
45                             int32_t Addend);
46
47   void resolveARMRelocation(uint8_t *LocalAddress,
48                             uint32_t FinalAddress,
49                             uint32_t Value,
50                             uint32_t Type,
51                             int32_t Addend);
52
53   void resolveMIPSRelocation(uint8_t *LocalAddress,
54                              uint32_t FinalAddress,
55                              uint32_t Value,
56                              uint32_t Type,
57                              int32_t Addend);
58
59   void resolvePPC64Relocation(uint8_t *LocalAddress,
60                               uint64_t FinalAddress,
61                               uint64_t Value,
62                               uint32_t Type,
63                               int64_t Addend);
64
65   virtual void resolveRelocation(uint8_t *LocalAddress,
66                                  uint64_t FinalAddress,
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