mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[LKH] Add a new IRTransformLayer.
llvm-svn: 333129
This commit is contained in:
parent
3e40b4fe7b
commit
6c303e6631
@ -15,7 +15,7 @@
|
||||
#define LLVM_EXECUTIONENGINE_ORC_IRTRANSFORMLAYER_H
|
||||
|
||||
#include "llvm/ExecutionEngine/JITSymbol.h"
|
||||
#include "llvm/ExecutionEngine/Orc/Core.h"
|
||||
#include "llvm/ExecutionEngine/Orc/Layer.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
@ -23,6 +23,24 @@ namespace llvm {
|
||||
class Module;
|
||||
namespace orc {
|
||||
|
||||
class IRTransformLayer2 : public IRLayer {
|
||||
public:
|
||||
|
||||
using TransformFunction =
|
||||
std::function<Expected<std::unique_ptr<Module>>(std::unique_ptr<Module>)>;
|
||||
|
||||
IRTransformLayer2(ExecutionSession &ES,
|
||||
IRLayer &BaseLayer,
|
||||
TransformFunction Transform);
|
||||
|
||||
void emit(MaterializationResponsibility R, VModuleKey K,
|
||||
std::unique_ptr<Module> M) override;
|
||||
|
||||
private:
|
||||
IRLayer &BaseLayer;
|
||||
TransformFunction Transform;
|
||||
};
|
||||
|
||||
/// IR mutating layer.
|
||||
///
|
||||
/// This layer applies a user supplied transform to each module that is added,
|
||||
|
@ -3,6 +3,7 @@ add_llvm_library(LLVMOrcJIT
|
||||
ExecutionUtils.cpp
|
||||
IndirectionUtils.cpp
|
||||
IRCompileLayer.cpp
|
||||
IRTransformLayer.cpp
|
||||
Legacy.cpp
|
||||
Layer.cpp
|
||||
NullResolver.cpp
|
||||
|
34
lib/ExecutionEngine/Orc/IRTransformLayer.cpp
Normal file
34
lib/ExecutionEngine/Orc/IRTransformLayer.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
//===-------------- IRTransformLayer.cpp - IR Transform 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/IRTransformLayer.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
|
||||
namespace llvm {
|
||||
namespace orc {
|
||||
|
||||
IRTransformLayer2::IRTransformLayer2(ExecutionSession &ES,
|
||||
IRLayer &BaseLayer,
|
||||
TransformFunction Transform)
|
||||
: IRLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
|
||||
|
||||
void IRTransformLayer2::emit(MaterializationResponsibility R, VModuleKey K,
|
||||
std::unique_ptr<Module> M) {
|
||||
assert(M && "Module must not be null");
|
||||
|
||||
if (auto TransformedMod = Transform(std::move(M)))
|
||||
BaseLayer.emit(std::move(R), std::move(K), std::move(*TransformedMod));
|
||||
else {
|
||||
R.failMaterialization();
|
||||
getExecutionSession().reportError(TransformedMod.takeError());
|
||||
}
|
||||
}
|
||||
|
||||
} // End namespace orc.
|
||||
} // End namespace llvm.
|
Loading…
Reference in New Issue
Block a user