1 //===--------------- IRCompileLayer.cpp - IR Compiling Layer --------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
10
11 namespace llvm {
12 namespace orc {
13
IRCompileLayer(ExecutionSession & ES,ObjectLayer & BaseLayer,CompileFunction Compile)14 IRCompileLayer::IRCompileLayer(ExecutionSession &ES, ObjectLayer &BaseLayer,
15 CompileFunction Compile)
16 : IRLayer(ES), BaseLayer(BaseLayer), Compile(std::move(Compile)) {}
17
setNotifyCompiled(NotifyCompiledFunction NotifyCompiled)18 void IRCompileLayer::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) {
19 std::lock_guard<std::mutex> Lock(IRLayerMutex);
20 this->NotifyCompiled = std::move(NotifyCompiled);
21 }
22
emit(MaterializationResponsibility R,ThreadSafeModule TSM)23 void IRCompileLayer::emit(MaterializationResponsibility R,
24 ThreadSafeModule TSM) {
25 assert(TSM.getModule() && "Module must not be null");
26
27 if (auto Obj = Compile(*TSM.getModule())) {
28 {
29 std::lock_guard<std::mutex> Lock(IRLayerMutex);
30 if (NotifyCompiled)
31 NotifyCompiled(R.getVModuleKey(), std::move(TSM));
32 else
33 TSM = ThreadSafeModule();
34 }
35 BaseLayer.emit(std::move(R), std::move(*Obj));
36 } else {
37 R.failMaterialization();
38 getExecutionSession().reportError(Obj.takeError());
39 }
40 }
41
42 } // End namespace orc.
43 } // End namespace llvm.
44