blob: f9cc15583b423dfde009a3000d0c87f6a3c5cb55 [file] [log] [blame]
Andrew Scullcdfcccc2018-10-05 20:58:37 +01001//===---------------- Layer.h -- Layer interfaces --------------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scullcdfcccc2018-10-05 20:58:37 +01006//
7//===----------------------------------------------------------------------===//
8//
9// Layer interfaces.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_LAYER_H
14#define LLVM_EXECUTIONENGINE_ORC_LAYER_H
15
16#include "llvm/ExecutionEngine/Orc/Core.h"
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020017#include "llvm/ExecutionEngine/Orc/Mangling.h"
Andrew Scull0372a572018-11-16 15:47:06 +000018#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
Andrew Scullcdfcccc2018-10-05 20:58:37 +010019#include "llvm/IR/Module.h"
20#include "llvm/Support/MemoryBuffer.h"
21
22namespace llvm {
23namespace orc {
24
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020025/// 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.
29class IRMaterializationUnit : public MaterializationUnit {
30public:
31 using SymbolNameToDefinitionMap = std::map<SymbolStringPtr, GlobalValue *>;
32
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);
38
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);
47
48 /// Return the ModuleIdentifier as the name for this MaterializationUnit.
49 StringRef getName() const override;
50
51 /// Return a reference to the contained ThreadSafeModule.
52 const ThreadSafeModule &getModule() const { return TSM; }
53
54protected:
55 ThreadSafeModule TSM;
56 SymbolNameToDefinitionMap SymbolToDefinition;
57
58private:
59 static SymbolStringPtr getInitSymbol(ExecutionSession &ES,
60 const ThreadSafeModule &TSM);
61
62 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
63};
64
Andrew Scullcdfcccc2018-10-05 20:58:37 +010065/// Interface for layers that accept LLVM IR.
66class IRLayer {
67public:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020068 IRLayer(ExecutionSession &ES, const IRSymbolMapper::ManglingOptions *&MO)
69 : ES(ES), MO(MO) {}
70
Andrew Scullcdfcccc2018-10-05 20:58:37 +010071 virtual ~IRLayer();
72
73 /// Returns the ExecutionSession for this layer.
74 ExecutionSession &getExecutionSession() { return ES; }
75
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020076 /// Get the mangling options for this layer.
77 const IRSymbolMapper::ManglingOptions *&getManglingOptions() const {
78 return MO;
79 }
80
Andrew Scull0372a572018-11-16 15:47:06 +000081 /// Sets the CloneToNewContextOnEmit flag (false by default).
82 ///
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;
92 }
93
94 /// Returns the current value of the CloneToNewContextOnEmit flag.
95 bool getCloneToNewContextOnEmit() const { return CloneToNewContextOnEmit; }
96
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020097 /// Add a MaterializatinoUnit representing the given IR to the JITDylib
98 /// targeted by the given tracker.
99 virtual Error add(ResourceTrackerSP RT, ThreadSafeModule TSM);
100
Andrew Scull0372a572018-11-16 15:47:06 +0000101 /// Adds a MaterializationUnit representing the given IR to the given
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200102 /// JITDylib. If RT is not specif
103 Error add(JITDylib &JD, ThreadSafeModule TSM) {
104 return add(JD.getDefaultResourceTracker(), std::move(TSM));
105 }
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100106
107 /// Emit should materialize the given IR.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200108 virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
109 ThreadSafeModule TSM) = 0;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100110
111private:
Andrew Scull0372a572018-11-16 15:47:06 +0000112 bool CloneToNewContextOnEmit = false;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100113 ExecutionSession &ES;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200114 const IRSymbolMapper::ManglingOptions *&MO;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100115};
116
117/// MaterializationUnit that materializes modules by calling the 'emit' method
118/// on the given IRLayer.
119class BasicIRLayerMaterializationUnit : public IRMaterializationUnit {
120public:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200121 BasicIRLayerMaterializationUnit(IRLayer &L,
122 const IRSymbolMapper::ManglingOptions &MO,
Andrew Scull0372a572018-11-16 15:47:06 +0000123 ThreadSafeModule TSM);
124
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100125private:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200126 void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100127
128 IRLayer &L;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100129};
130
131/// Interface for Layers that accept object files.
132class ObjectLayer {
133public:
134 ObjectLayer(ExecutionSession &ES);
135 virtual ~ObjectLayer();
136
137 /// Returns the execution session for this layer.
138 ExecutionSession &getExecutionSession() { return ES; }
139
Andrew Scull0372a572018-11-16 15:47:06 +0000140 /// Adds a MaterializationUnit representing the given IR to the given
141 /// JITDylib.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200142 virtual Error add(ResourceTrackerSP RT, std::unique_ptr<MemoryBuffer> O);
143
144 Error add(JITDylib &JD, std::unique_ptr<MemoryBuffer> O) {
145 return add(JD.getDefaultResourceTracker(), std::move(O));
146 }
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100147
148 /// Emit should materialize the given IR.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200149 virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100150 std::unique_ptr<MemoryBuffer> O) = 0;
151
152private:
153 ExecutionSession &ES;
154};
155
156/// Materializes the given object file (represented by a MemoryBuffer
157/// instance) by calling 'emit' on the given ObjectLayer.
158class BasicObjectLayerMaterializationUnit : public MaterializationUnit {
159public:
160 static Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>>
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200161 Create(ObjectLayer &L, std::unique_ptr<MemoryBuffer> O);
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100162
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200163 BasicObjectLayerMaterializationUnit(ObjectLayer &L,
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100164 std::unique_ptr<MemoryBuffer> O,
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200165 SymbolFlagsMap SymbolFlags,
166 SymbolStringPtr InitSymbol);
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100167
Andrew Scull0372a572018-11-16 15:47:06 +0000168 /// Return the buffer's identifier as the name for this MaterializationUnit.
169 StringRef getName() const override;
170
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100171private:
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200172 void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
Andrew Scull0372a572018-11-16 15:47:06 +0000173 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100174
175 ObjectLayer &L;
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100176 std::unique_ptr<MemoryBuffer> O;
177};
178
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100179} // End namespace orc
180} // End namespace llvm
181
182#endif // LLVM_EXECUTIONENGINE_ORC_LAYER_H