| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
 | //===-- RuntimeDyldImpl.h - Run-time dynamic linker for MC-JIT --*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Interface for the implementations of runtime dynamic linker facilities.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_RUNTIME_DYLD_IMPL_H
#define LLVM_RUNTIME_DYLD_IMPL_H
#include "llvm/ExecutionEngine/RuntimeDyld.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/Support/Memory.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/system_error.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
namespace llvm {
class RuntimeDyldImpl {
protected:
  unsigned CPUType;
  unsigned CPUSubtype;
  // The MemoryManager to load objects into.
  RTDyldMemoryManager *MemMgr;
  // For each section, we have a MemoryBlock of it's data.
  // Indexed by SectionID.
  SmallVector<sys::MemoryBlock, 32> Sections;
  // For each section, the address it will be considered to live at for
  // relocations. The same as the pointer to the above memory block for hosted
  // JITs. Indexed by SectionID.
  SmallVector<uint64_t, 32> SectionLoadAddress;
  // Keep a map of starting local address to the SectionID which references it.
  // Lookup function for when we assign virtual addresses.
  DenseMap<void *, unsigned> SectionLocalMemToID;
  // Master symbol table. As modules are loaded and external symbols are
  // resolved, their addresses are stored here as a SectionID/Offset pair.
  typedef std::pair<unsigned, uint64_t> SymbolLoc;
  StringMap<SymbolLoc> SymbolTable;
  bool HasError;
  std::string ErrorStr;
  // Set the error state and record an error string.
  bool Error(const Twine &Msg) {
    ErrorStr = Msg.str();
    HasError = true;
    return true;
  }
  uint8_t *getSectionAddress(unsigned SectionID) {
    return (uint8_t*)Sections[SectionID].base();
  }
  void extractFunction(StringRef Name, uint8_t *StartAddress,
                       uint8_t *EndAddress);
public:
  RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}
  virtual ~RuntimeDyldImpl();
  virtual bool loadObject(MemoryBuffer *InputBuffer) = 0;
  void *getSymbolAddress(StringRef Name) {
    // FIXME: Just look up as a function for now. Overly simple of course.
    // Work in progress.
    if (SymbolTable.find(Name) == SymbolTable.end())
      return 0;
    SymbolLoc Loc = SymbolTable.lookup(Name);
    return getSectionAddress(Loc.first) + Loc.second;
  }
  virtual void resolveRelocations();
  virtual void reassignSectionAddress(unsigned SectionID, uint64_t Addr) = 0;
  void mapSectionAddress(void *LocalAddress, uint64_t TargetAddress);
  // Is the linker in an error state?
  bool hasError() { return HasError; }
  // Mark the error condition as handled and continue.
  void clearError() { HasError = false; }
  // Get the error message.
  StringRef getErrorString() { return ErrorStr; }
  virtual bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const = 0;
};
} // end namespace llvm
#endif
 |