1 //===--------------- IRCompileLayer.cpp - IR Compiling Layer --------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" 11 12 namespace llvm { 13 namespace orc { 14 15 IRCompileLayer2::IRCompileLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer, 16 CompileFunction Compile) 17 : IRLayer(ES), BaseLayer(BaseLayer), Compile(std::move(Compile)) {} 18 19 void IRCompileLayer2::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) { 20 std::lock_guard<std::mutex> Lock(IRLayerMutex); 21 this->NotifyCompiled = std::move(NotifyCompiled); 22 } 23 24 void IRCompileLayer2::emit(MaterializationResponsibility R, VModuleKey K, 25 std::unique_ptr<Module> M) { 26 assert(M && "Module must not be null"); 27 28 if (auto Obj = Compile(*M)) { 29 { 30 std::lock_guard<std::mutex> Lock(IRLayerMutex); 31 if (NotifyCompiled) 32 NotifyCompiled(K, std::move(M)); 33 else 34 M = nullptr; 35 } 36 BaseLayer.emit(std::move(R), std::move(K), std::move(*Obj)); 37 } else { 38 R.failMaterialization(); 39 getExecutionSession().reportError(Obj.takeError()); 40 } 41 } 42 43 } // End namespace orc. 44 } // End namespace llvm. 45