LLVM  8.0.1
GlobalMappingLayer.h
Go to the documentation of this file.
1 //===- GlobalMappingLayer.h - Run all IR through a functor ------*- 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 // Convenience layer for injecting symbols that will appear in calls to
11 // findSymbol.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_EXECUTIONENGINE_ORC_GLOBALMAPPINGLAYER_H
16 #define LLVM_EXECUTIONENGINE_ORC_GLOBALMAPPINGLAYER_H
17 
19 #include <map>
20 #include <memory>
21 #include <string>
22 
23 namespace llvm {
24 
25 class Module;
26 class JITSymbolResolver;
27 
28 namespace orc {
29 
30 /// Global mapping layer.
31 ///
32 /// This layer overrides the findSymbol method to first search a local symbol
33 /// table that the client can define. It can be used to inject new symbol
34 /// mappings into the JIT. Beware, however: symbols within a single IR module or
35 /// object file will still resolve locally (via RuntimeDyld's symbol table) -
36 /// such internal references cannot be overriden via this layer.
37 template <typename BaseLayerT>
39 public:
40 
41  /// Handle to an added module.
42  using ModuleHandleT = typename BaseLayerT::ModuleHandleT;
43 
44  /// Construct an GlobalMappingLayer with the given BaseLayer
45  GlobalMappingLayer(BaseLayerT &BaseLayer) : BaseLayer(BaseLayer) {}
46 
47  /// Add the given module to the JIT.
48  /// @return A handle for the added modules.
50  addModule(std::shared_ptr<Module> M,
51  std::shared_ptr<JITSymbolResolver> Resolver) {
52  return BaseLayer.addModule(std::move(M), std::move(Resolver));
53  }
54 
55  /// Remove the module set associated with the handle H.
56  Error removeModule(ModuleHandleT H) { return BaseLayer.removeModule(H); }
57 
58  /// Manually set the address to return for the given symbol.
59  void setGlobalMapping(const std::string &Name, JITTargetAddress Addr) {
60  SymbolTable[Name] = Addr;
61  }
62 
63  /// Remove the given symbol from the global mapping.
64  void eraseGlobalMapping(const std::string &Name) {
65  SymbolTable.erase(Name);
66  }
67 
68  /// Search for the given named symbol.
69  ///
70  /// This method will first search the local symbol table, returning
71  /// any symbol found there. If the symbol is not found in the local
72  /// table then this call will be passed through to the base layer.
73  ///
74  /// @param Name The name of the symbol to search for.
75  /// @param ExportedSymbolsOnly If true, search only for exported symbols.
76  /// @return A handle for the given named symbol, if it exists.
77  JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
78  auto I = SymbolTable.find(Name);
79  if (I != SymbolTable.end())
80  return JITSymbol(I->second, JITSymbolFlags::Exported);
81  return BaseLayer.findSymbol(Name, ExportedSymbolsOnly);
82  }
83 
84  /// Get the address of the given symbol in the context of the of the
85  /// module represented by the handle H. This call is forwarded to the
86  /// base layer's implementation.
87  /// @param H The handle for the module to search in.
88  /// @param Name The name of the symbol to search for.
89  /// @param ExportedSymbolsOnly If true, search only for exported symbols.
90  /// @return A handle for the given named symbol, if it is found in the
91  /// given module.
92  JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name,
93  bool ExportedSymbolsOnly) {
94  return BaseLayer.findSymbolIn(H, Name, ExportedSymbolsOnly);
95  }
96 
97  /// Immediately emit and finalize the module set represented by the
98  /// given handle.
99  /// @param H Handle for module set to emit/finalize.
101  return BaseLayer.emitAndFinalize(H);
102  }
103 
104 private:
105  BaseLayerT &BaseLayer;
106  std::map<std::string, JITTargetAddress> SymbolTable;
107 };
108 
109 } // end namespace orc
110 } // end namespace llvm
111 
112 #endif // LLVM_EXECUTIONENGINE_ORC_GLOBALMAPPINGLAYER_H
Represents a symbol in the JIT.
Definition: JITSymbol.h:238
This class represents lattice values for constants.
Definition: AllocatorList.h:24
Expected< ModuleHandleT > addModule(std::shared_ptr< Module > M, std::shared_ptr< JITSymbolResolver > Resolver)
Add the given module to the JIT.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
Tagged union holding either a T or a Error.
Definition: CachePruning.h:23
typename BaseLayerT::ModuleHandleT ModuleHandleT
Handle to an added module.
GlobalMappingLayer(BaseLayerT &BaseLayer)
Construct an GlobalMappingLayer with the given BaseLayer.
uint64_t JITTargetAddress
Represents an address in the target process&#39;s address space.
Definition: JITSymbol.h:41
void eraseGlobalMapping(const std::string &Name)
Remove the given symbol from the global mapping.
#define H(x, y, z)
Definition: MD5.cpp:57
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition: Record.h:1774
Error emitAndFinalize(ModuleHandleT H)
Immediately emit and finalize the module set represented by the given handle.
void setGlobalMapping(const std::string &Name, JITTargetAddress Addr)
Manually set the address to return for the given symbol.
JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly)
Search for the given named symbol.
Error removeModule(ModuleHandleT H)
Remove the module set associated with the handle H.
#define I(x, y, z)
Definition: MD5.cpp:58
JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name, bool ExportedSymbolsOnly)
Get the address of the given symbol in the context of the of the module represented by the handle H...
Lightweight error class with error context and mandatory checking.
Definition: Error.h:158