Whitespace cleanups.
[oota-llvm.git] / lib / ExecutionEngine / RuntimeDyld / RuntimeDyldMachO.h
1 //===-- RuntimeDyldMachO.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 // MachO support for MC-JIT runtime dynamic linker.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_RUNTIME_DYLD_MACHO_H
15 #define LLVM_RUNTIME_DYLD_MACHO_H
16
17 #include "RuntimeDyldImpl.h"
18 #include "llvm/ADT/IndexedMap.h"
19 #include "llvm/Object/MachO.h"
20 #include "llvm/Support/Format.h"
21
22 using namespace llvm;
23 using namespace llvm::object;
24
25
26 namespace llvm {
27 class RuntimeDyldMachO : public RuntimeDyldImpl {
28   bool resolveI386Relocation(uint8_t *LocalAddress,
29                              uint64_t FinalAddress,
30                              uint64_t Value,
31                              bool isPCRel,
32                              unsigned Type,
33                              unsigned Size,
34                              int64_t Addend);
35   bool resolveX86_64Relocation(uint8_t *LocalAddress,
36                                uint64_t FinalAddress,
37                                uint64_t Value,
38                                bool isPCRel,
39                                unsigned Type,
40                                unsigned Size,
41                                int64_t Addend);
42   bool resolveARMRelocation(uint8_t *LocalAddress,
43                             uint64_t FinalAddress,
44                             uint64_t Value,
45                             bool isPCRel,
46                             unsigned Type,
47                             unsigned Size,
48                             int64_t Addend);
49
50   void resolveRelocation(const SectionEntry &Section,
51                          uint64_t Offset,
52                          uint64_t Value,
53                          uint32_t Type,
54                          int64_t Addend,
55                          bool isPCRel,
56                          unsigned Size);
57
58   unsigned getMaxStubSize() {
59     if (Arch == Triple::arm || Arch == Triple::thumb)
60       return 8; // 32-bit instruction and 32-bit address
61     else if (Arch == Triple::x86_64)
62       return 8; // GOT entry
63     else
64       return 0;
65   }
66
67   unsigned getStubAlignment() {
68     return 1;
69   }
70
71   struct EHFrameRelatedSections {
72     EHFrameRelatedSections() : EHFrameSID(RTDYLD_INVALID_SECTION_ID),
73                                TextSID(RTDYLD_INVALID_SECTION_ID),
74                                ExceptTabSID(RTDYLD_INVALID_SECTION_ID) {}
75     EHFrameRelatedSections(SID EH, SID T, SID Ex)
76       : EHFrameSID(EH), TextSID(T), ExceptTabSID(Ex) {}
77     SID EHFrameSID;
78     SID TextSID;
79     SID ExceptTabSID;
80   };
81
82   // When a module is loaded we save the SectionID of the EH frame section
83   // in a table until we receive a request to register all unregistered
84   // EH frame sections with the memory manager.
85   SmallVector<EHFrameRelatedSections, 2> UnregisteredEHFrameSections;
86 public:
87   RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
88
89   virtual void resolveRelocation(const RelocationEntry &RE, uint64_t Value);
90   virtual void processRelocationRef(unsigned SectionID,
91                                     RelocationRef RelI,
92                                     ObjectImage &Obj,
93                                     ObjSectionToIDMap &ObjSectionToID,
94                                     const SymbolTableMap &Symbols,
95                                     StubMap &Stubs);
96   virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const;
97   virtual void registerEHFrames();
98   virtual void finalizeLoad(ObjSectionToIDMap &SectionMap);
99 };
100
101 } // end namespace llvm
102
103 #endif