forked from OSchip/llvm-project
parent
08b682bec1
commit
4caa2f70ac
|
@ -16,8 +16,9 @@
|
|||
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ExecutionEngine/JITSymbol.h"
|
||||
#include "llvm/ExecutionEngine/Orc/Core.h"
|
||||
#include "llvm/ExecutionEngine/Orc/Layer.h"
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
|
@ -27,6 +28,29 @@ class Module;
|
|||
|
||||
namespace orc {
|
||||
|
||||
class IRCompileLayer2 : public IRLayer {
|
||||
public:
|
||||
using CompileFunction =
|
||||
std::function<Expected<std::unique_ptr<MemoryBuffer>>(Module &)>;
|
||||
|
||||
using NotifyCompiledFunction =
|
||||
std::function<void(VModuleKey K, std::unique_ptr<Module>)>;
|
||||
|
||||
IRCompileLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer,
|
||||
CompileFunction Compile);
|
||||
|
||||
void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled);
|
||||
|
||||
void emit(MaterializationResponsibility R, VModuleKey K,
|
||||
std::unique_ptr<Module> M) override;
|
||||
|
||||
private:
|
||||
mutable std::mutex IRLayerMutex;
|
||||
ObjectLayer &BaseLayer;
|
||||
CompileFunction Compile;
|
||||
NotifyCompiledFunction NotifyCompiled = NotifyCompiledFunction();
|
||||
};
|
||||
|
||||
/// Eager IR compiling layer.
|
||||
///
|
||||
/// This layer immediately compiles each IR module added via addModule to an
|
||||
|
|
|
@ -2,6 +2,7 @@ add_llvm_library(LLVMOrcJIT
|
|||
Core.cpp
|
||||
ExecutionUtils.cpp
|
||||
IndirectionUtils.cpp
|
||||
IRCompileLayer.cpp
|
||||
Legacy.cpp
|
||||
Layer.cpp
|
||||
NullResolver.cpp
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
//===--------------- IRCompileLayer.cpp - IR Compiling Layer --------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace orc {
|
||||
|
||||
IRCompileLayer2::IRCompileLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer,
|
||||
CompileFunction Compile)
|
||||
: IRLayer(ES), BaseLayer(BaseLayer), Compile(std::move(Compile)) {}
|
||||
|
||||
void IRCompileLayer2::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) {
|
||||
std::lock_guard<std::mutex> Lock(IRLayerMutex);
|
||||
this->NotifyCompiled = std::move(NotifyCompiled);
|
||||
}
|
||||
|
||||
void IRCompileLayer2::emit(MaterializationResponsibility R, VModuleKey K,
|
||||
std::unique_ptr<Module> M) {
|
||||
assert(M && "Module must not be null");
|
||||
|
||||
if (auto Obj = Compile(*M)) {
|
||||
{
|
||||
std::lock_guard<std::mutex> Lock(IRLayerMutex);
|
||||
if (NotifyCompiled)
|
||||
NotifyCompiled(K, std::move(M));
|
||||
else
|
||||
M = nullptr;
|
||||
}
|
||||
BaseLayer.emit(std::move(R), std::move(K), std::move(*Obj));
|
||||
} else {
|
||||
R.failMaterialization();
|
||||
getExecutionSession().reportError(Obj.takeError());
|
||||
}
|
||||
}
|
||||
|
||||
} // End namespace orc.
|
||||
} // End namespace llvm.
|
|
@ -22,7 +22,7 @@ RTDyldObjectLinkingLayer2::RTDyldObjectLinkingLayer2(
|
|||
void RTDyldObjectLinkingLayer2::emit(MaterializationResponsibility R,
|
||||
VModuleKey K,
|
||||
std::unique_ptr<MemoryBuffer> O) {
|
||||
assert(O && "Object has already been materialized");
|
||||
assert(O && "Object must not be null");
|
||||
|
||||
auto &ES = getExecutionSession();
|
||||
|
||||
|
|
Loading…
Reference in New Issue