1 //===---------------- Layer.h -- Layer interfaces --------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_EXECUTIONENGINE_ORC_LAYER_H
14 #define LLVM_EXECUTIONENGINE_ORC_LAYER_H
16 #include "llvm/ExecutionEngine/Orc/Core.h"
17 #include "llvm/ExecutionEngine/Orc/Mangling.h"
18 #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/Support/MemoryBuffer.h"
25 /// IRMaterializationUnit is a convenient base class for MaterializationUnits
26 /// wrapping LLVM IR. Represents materialization responsibility for all symbols
27 /// in the given module. If symbols are overridden by other definitions, then
28 /// their linkage is changed to available-externally.
29 class IRMaterializationUnit : public MaterializationUnit {
31 using SymbolNameToDefinitionMap = std::map<SymbolStringPtr, GlobalValue *>;
33 /// Create an IRMaterializationLayer. Scans the module to build the
34 /// SymbolFlags and SymbolToDefinition maps.
35 IRMaterializationUnit(ExecutionSession &ES,
36 const IRSymbolMapper::ManglingOptions &MO,
37 ThreadSafeModule TSM);
39 /// Create an IRMaterializationLayer from a module, and pre-existing
40 /// SymbolFlags and SymbolToDefinition maps. The maps must provide
41 /// entries for each definition in M.
42 /// This constructor is useful for delegating work from one
43 /// IRMaterializationUnit to another.
44 IRMaterializationUnit(ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags,
45 SymbolStringPtr InitSymbol,
46 SymbolNameToDefinitionMap SymbolToDefinition);
48 /// Return the ModuleIdentifier as the name for this MaterializationUnit.
49 StringRef getName() const override;
51 /// Return a reference to the contained ThreadSafeModule.
52 const ThreadSafeModule &getModule() const { return TSM; }
56 SymbolNameToDefinitionMap SymbolToDefinition;
59 static SymbolStringPtr getInitSymbol(ExecutionSession &ES,
60 const ThreadSafeModule &TSM);
62 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
65 /// Interface for layers that accept LLVM IR.
68 IRLayer(ExecutionSession &ES, const IRSymbolMapper::ManglingOptions *&MO)
73 /// Returns the ExecutionSession for this layer.
74 ExecutionSession &getExecutionSession() { return ES; }
76 /// Get the mangling options for this layer.
77 const IRSymbolMapper::ManglingOptions *&getManglingOptions() const {
81 /// Sets the CloneToNewContextOnEmit flag (false by default).
83 /// When set, IR modules added to this layer will be cloned on to a new
84 /// context before emit is called. This can be used by clients who want
85 /// to load all IR using one LLVMContext (to save memory via type and
86 /// constant uniquing), but want to move Modules to fresh contexts before
87 /// compiling them to enable concurrent compilation.
88 /// Single threaded clients, or clients who load every module on a new
89 /// context, need not set this.
90 void setCloneToNewContextOnEmit(bool CloneToNewContextOnEmit) {
91 this->CloneToNewContextOnEmit = CloneToNewContextOnEmit;
94 /// Returns the current value of the CloneToNewContextOnEmit flag.
95 bool getCloneToNewContextOnEmit() const { return CloneToNewContextOnEmit; }
97 /// Add a MaterializatinoUnit representing the given IR to the JITDylib
98 /// targeted by the given tracker.
99 virtual Error add(ResourceTrackerSP RT, ThreadSafeModule TSM);
101 /// Adds a MaterializationUnit representing the given IR to the given
102 /// JITDylib. If RT is not specif
103 Error add(JITDylib &JD, ThreadSafeModule TSM) {
104 return add(JD.getDefaultResourceTracker(), std::move(TSM));
107 /// Emit should materialize the given IR.
108 virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
109 ThreadSafeModule TSM) = 0;
112 bool CloneToNewContextOnEmit = false;
113 ExecutionSession &ES;
114 const IRSymbolMapper::ManglingOptions *&MO;
117 /// MaterializationUnit that materializes modules by calling the 'emit' method
118 /// on the given IRLayer.
119 class BasicIRLayerMaterializationUnit : public IRMaterializationUnit {
121 BasicIRLayerMaterializationUnit(IRLayer &L,
122 const IRSymbolMapper::ManglingOptions &MO,
123 ThreadSafeModule TSM);
126 void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
131 /// Interface for Layers that accept object files.
134 ObjectLayer(ExecutionSession &ES);
135 virtual ~ObjectLayer();
137 /// Returns the execution session for this layer.
138 ExecutionSession &getExecutionSession() { return ES; }
140 /// Adds a MaterializationUnit representing the given IR to the given
142 virtual Error add(ResourceTrackerSP RT, std::unique_ptr<MemoryBuffer> O);
144 Error add(JITDylib &JD, std::unique_ptr<MemoryBuffer> O) {
145 return add(JD.getDefaultResourceTracker(), std::move(O));
148 /// Emit should materialize the given IR.
149 virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
150 std::unique_ptr<MemoryBuffer> O) = 0;
153 ExecutionSession &ES;
156 /// Materializes the given object file (represented by a MemoryBuffer
157 /// instance) by calling 'emit' on the given ObjectLayer.
158 class BasicObjectLayerMaterializationUnit : public MaterializationUnit {
160 static Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>>
161 Create(ObjectLayer &L, std::unique_ptr<MemoryBuffer> O);
163 BasicObjectLayerMaterializationUnit(ObjectLayer &L,
164 std::unique_ptr<MemoryBuffer> O,
165 SymbolFlagsMap SymbolFlags,
166 SymbolStringPtr InitSymbol);
168 /// Return the buffer's identifier as the name for this MaterializationUnit.
169 StringRef getName() const override;
172 void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
173 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
176 std::unique_ptr<MemoryBuffer> O;
179 } // End namespace orc
180 } // End namespace llvm
182 #endif // LLVM_EXECUTIONENGINE_ORC_LAYER_H