10b57cec5SDimitry Andric //===--------------- IRCompileLayer.cpp - IR Compiling Layer --------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
100b57cec5SDimitry Andric
110b57cec5SDimitry Andric namespace llvm {
120b57cec5SDimitry Andric namespace orc {
130b57cec5SDimitry Andric
14*81ad6265SDimitry Andric IRCompileLayer::IRCompiler::~IRCompiler() = default;
1513138422SDimitry Andric
IRCompileLayer(ExecutionSession & ES,ObjectLayer & BaseLayer,std::unique_ptr<IRCompiler> Compile)160b57cec5SDimitry Andric IRCompileLayer::IRCompileLayer(ExecutionSession &ES, ObjectLayer &BaseLayer,
1713138422SDimitry Andric std::unique_ptr<IRCompiler> Compile)
1813138422SDimitry Andric : IRLayer(ES, ManglingOpts), BaseLayer(BaseLayer),
1913138422SDimitry Andric Compile(std::move(Compile)) {
2013138422SDimitry Andric ManglingOpts = &this->Compile->getManglingOptions();
2113138422SDimitry Andric }
220b57cec5SDimitry Andric
setNotifyCompiled(NotifyCompiledFunction NotifyCompiled)230b57cec5SDimitry Andric void IRCompileLayer::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) {
240b57cec5SDimitry Andric std::lock_guard<std::mutex> Lock(IRLayerMutex);
250b57cec5SDimitry Andric this->NotifyCompiled = std::move(NotifyCompiled);
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric
emit(std::unique_ptr<MaterializationResponsibility> R,ThreadSafeModule TSM)28e8d8bef9SDimitry Andric void IRCompileLayer::emit(std::unique_ptr<MaterializationResponsibility> R,
290b57cec5SDimitry Andric ThreadSafeModule TSM) {
308bcb0991SDimitry Andric assert(TSM && "Module must not be null");
310b57cec5SDimitry Andric
3213138422SDimitry Andric if (auto Obj = TSM.withModuleDo(*Compile)) {
330b57cec5SDimitry Andric {
340b57cec5SDimitry Andric std::lock_guard<std::mutex> Lock(IRLayerMutex);
350b57cec5SDimitry Andric if (NotifyCompiled)
36e8d8bef9SDimitry Andric NotifyCompiled(*R, std::move(TSM));
370b57cec5SDimitry Andric else
380b57cec5SDimitry Andric TSM = ThreadSafeModule();
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric BaseLayer.emit(std::move(R), std::move(*Obj));
410b57cec5SDimitry Andric } else {
42e8d8bef9SDimitry Andric R->failMaterialization();
430b57cec5SDimitry Andric getExecutionSession().reportError(Obj.takeError());
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric
470b57cec5SDimitry Andric } // End namespace orc.
480b57cec5SDimitry Andric } // End namespace llvm.
49