Adding PIC support for ELF on x86_64 platforms
[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   void resolveRelocation(const SectionEntry &Section,
35                          uint64_t Offset,
36                          uint64_t Value,
37                          uint32_t Type,
38                          int64_t Addend,
39                          uint64_t SymOffset=0);
40
41   void resolveX86_64Relocation(const SectionEntry &Section,
42                                uint64_t Offset,
43                                uint64_t Value,
44                                uint32_t Type,
45                                int64_t  Addend,
46                                uint64_t SymOffset);
47
48   void resolveX86Relocation(const SectionEntry &Section,
49                             uint64_t Offset,
50                             uint32_t Value,
51                             uint32_t Type,
52                             int32_t Addend);
53
54   void resolveAArch64Relocation(const SectionEntry &Section,
55                                 uint64_t Offset,
56                                 uint64_t Value,
57                                 uint32_t Type,
58                                 int64_t Addend);
59
60   void resolveARMRelocation(const SectionEntry &Section,
61                             uint64_t Offset,
62                             uint32_t Value,
63                             uint32_t Type,
64                             int32_t Addend);
65
66   void resolveMIPSRelocation(const SectionEntry &Section,
67                              uint64_t Offset,
68                              uint32_t Value,
69                              uint32_t Type,
70                              int32_t Addend);
71
72   void resolvePPC64Relocation(const SectionEntry &Section,
73                               uint64_t Offset,
74                               uint64_t Value,
75                               uint32_t Type,
76                               int64_t Addend);
77
78   void resolveSystemZRelocation(const SectionEntry &Section,
79                                 uint64_t Offset,
80                                 uint64_t Value,
81                                 uint32_t Type,
82                                 int64_t Addend);
83
84   uint64_t findPPC64TOC() const;
85   void findOPDEntrySection(ObjectImage &Obj,
86                            ObjSectionToIDMap &LocalSections,
87                            RelocationValueRef &Rel);
88
89   uint64_t findGOTEntry(uint64_t LoadAddr, uint64_t Offset);
90   size_t getGOTEntrySize();
91
92   virtual void updateGOTEntries(StringRef Name, uint64_t Addr);
93
94   SmallVector<RelocationValueRef, 2>  GOTEntries;
95   unsigned GOTSectionID;
96
97 public:
98   RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm),
99                                             GOTSectionID(0)
100                                           {}
101
102   virtual void resolveRelocation(const RelocationEntry &RE, uint64_t Value);
103   virtual void processRelocationRef(unsigned SectionID,
104                                     RelocationRef RelI,
105                                     ObjectImage &Obj,
106                                     ObjSectionToIDMap &ObjSectionToID,
107                                     const SymbolTableMap &Symbols,
108                                     StubMap &Stubs);
109   virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const;
110   virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer);
111   virtual StringRef getEHFrameSection();
112   virtual void finalizeLoad();
113   virtual ~RuntimeDyldELF();
114 };
115
116 } // end namespace llvm
117
118 #endif