[LKH] Add a new IRCompileLayer.

llvm-svn: 333127
This commit is contained in:
Lang Hames 2018-05-23 21:27:01 +00:00
parent 08b682bec1
commit 4caa2f70ac
4 changed files with 71 additions and 2 deletions

View File

@ -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

View File

@ -2,6 +2,7 @@ add_llvm_library(LLVMOrcJIT
Core.cpp
ExecutionUtils.cpp
IndirectionUtils.cpp
IRCompileLayer.cpp
Legacy.cpp
Layer.cpp
NullResolver.cpp

View File

@ -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.

View File

@ -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();