1 //===- IRCompileLayer.h -- Eagerly compile IR for JIT -----------*- 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 //===----------------------------------------------------------------------===//
9 // Contains the definition for a basic, eagerly compiling layer of the JIT.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_EXECUTIONENGINE_ORC_IRCOMPILELAYER_H
14 #define LLVM_EXECUTIONENGINE_ORC_IRCOMPILELAYER_H
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ExecutionEngine/JITSymbol.h"
18 #include "llvm/ExecutionEngine/Orc/Layer.h"
19 #include "llvm/Support/Error.h"
20 #include "llvm/Support/MemoryBuffer.h"
30 class IRCompileLayer
: public IRLayer
{
32 using CompileFunction
=
33 std::function
<Expected
<std::unique_ptr
<MemoryBuffer
>>(Module
&)>;
35 using NotifyCompiledFunction
=
36 std::function
<void(VModuleKey K
, ThreadSafeModule TSM
)>;
38 IRCompileLayer(ExecutionSession
&ES
, ObjectLayer
&BaseLayer
,
39 CompileFunction Compile
);
41 void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled
);
43 void emit(MaterializationResponsibility R
, ThreadSafeModule TSM
) override
;
46 mutable std::mutex IRLayerMutex
;
47 ObjectLayer
&BaseLayer
;
48 CompileFunction Compile
;
49 NotifyCompiledFunction NotifyCompiled
= NotifyCompiledFunction();
52 /// Eager IR compiling layer.
54 /// This layer immediately compiles each IR module added via addModule to an
55 /// object file and adds this module file to the layer below, which must
56 /// implement the object layer concept.
57 template <typename BaseLayerT
, typename CompileFtor
>
58 class LegacyIRCompileLayer
{
60 /// Callback type for notifications when modules are compiled.
61 using NotifyCompiledCallback
=
62 std::function
<void(VModuleKey K
, std::unique_ptr
<Module
>)>;
64 /// Construct an LegacyIRCompileLayer with the given BaseLayer, which must
65 /// implement the ObjectLayer concept.
66 LLVM_ATTRIBUTE_DEPRECATED(
68 BaseLayerT
&BaseLayer
, CompileFtor Compile
,
69 NotifyCompiledCallback NotifyCompiled
= NotifyCompiledCallback()),
70 "ORCv1 layers (layers with the 'Legacy' prefix) are deprecated. Please "
72 "the ORCv2 IRCompileLayer instead");
74 /// Legacy layer constructor with deprecation acknowledgement.
76 ORCv1DeprecationAcknowledgement
, BaseLayerT
&BaseLayer
,
78 NotifyCompiledCallback NotifyCompiled
= NotifyCompiledCallback())
79 : BaseLayer(BaseLayer
), Compile(std::move(Compile
)),
80 NotifyCompiled(std::move(NotifyCompiled
)) {}
82 /// Get a reference to the compiler functor.
83 CompileFtor
& getCompiler() { return Compile
; }
85 /// (Re)set the NotifyCompiled callback.
86 void setNotifyCompiled(NotifyCompiledCallback NotifyCompiled
) {
87 this->NotifyCompiled
= std::move(NotifyCompiled
);
90 /// Compile the module, and add the resulting object to the base layer
91 /// along with the given memory manager and symbol resolver.
92 Error
addModule(VModuleKey K
, std::unique_ptr
<Module
> M
) {
93 if (auto Err
= BaseLayer
.addObject(std::move(K
), Compile(*M
)))
96 NotifyCompiled(std::move(K
), std::move(M
));
97 return Error::success();
100 /// Remove the module associated with the VModuleKey K.
101 Error
removeModule(VModuleKey K
) { return BaseLayer
.removeObject(K
); }
103 /// Search for the given named symbol.
104 /// @param Name The name of the symbol to search for.
105 /// @param ExportedSymbolsOnly If true, search only for exported symbols.
106 /// @return A handle for the given named symbol, if it exists.
107 JITSymbol
findSymbol(const std::string
&Name
, bool ExportedSymbolsOnly
) {
108 return BaseLayer
.findSymbol(Name
, ExportedSymbolsOnly
);
111 /// Get the address of the given symbol in compiled module represented
112 /// by the handle H. This call is forwarded to the base layer's
114 /// @param K The VModuleKey for the module to search in.
115 /// @param Name The name of the symbol to search for.
116 /// @param ExportedSymbolsOnly If true, search only for exported symbols.
117 /// @return A handle for the given named symbol, if it is found in the
119 JITSymbol
findSymbolIn(VModuleKey K
, const std::string
&Name
,
120 bool ExportedSymbolsOnly
) {
121 return BaseLayer
.findSymbolIn(K
, Name
, ExportedSymbolsOnly
);
124 /// Immediately emit and finalize the module represented by the given
126 /// @param K The VModuleKey for the module to emit/finalize.
127 Error
emitAndFinalize(VModuleKey K
) { return BaseLayer
.emitAndFinalize(K
); }
130 BaseLayerT
&BaseLayer
;
132 NotifyCompiledCallback NotifyCompiled
;
135 template <typename BaseLayerT
, typename CompileFtor
>
136 LegacyIRCompileLayer
<BaseLayerT
, CompileFtor
>::LegacyIRCompileLayer(
137 BaseLayerT
&BaseLayer
, CompileFtor Compile
,
138 NotifyCompiledCallback NotifyCompiled
)
139 : BaseLayer(BaseLayer
), Compile(std::move(Compile
)),
140 NotifyCompiled(std::move(NotifyCompiled
)) {}
142 } // end namespace orc
143 } // end namespace llvm
145 #endif // LLVM_EXECUTIONENGINE_ORC_IRCOMPILINGLAYER_H