xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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