[LKH] Add ObjectTransformLayer2.

llvm-svn: 333128
This commit is contained in:
Lang Hames 2018-05-23 21:27:06 +00:00
parent 4caa2f70ac
commit 85642262b2
3 changed files with 53 additions and 1 deletions

View File

@ -15,7 +15,7 @@
#define LLVM_EXECUTIONENGINE_ORC_OBJECTTRANSFORMLAYER_H
#include "llvm/ExecutionEngine/JITSymbol.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
#include "llvm/ExecutionEngine/Orc/Layer.h"
#include <algorithm>
#include <memory>
#include <string>
@ -23,6 +23,23 @@
namespace llvm {
namespace orc {
class ObjectTransformLayer2 : public ObjectLayer {
public:
using TransformFunction =
std::function<Expected<std::unique_ptr<MemoryBuffer>>(
std::unique_ptr<MemoryBuffer>)>;
ObjectTransformLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer,
TransformFunction Transform);
void emit(MaterializationResponsibility R, VModuleKey K,
std::unique_ptr<MemoryBuffer> O) override;
private:
ObjectLayer &BaseLayer;
TransformFunction Transform;
};
/// Object mutating layer.
///
/// This layer accepts sets of ObjectFiles (via addObject). It

View File

@ -6,6 +6,7 @@ add_llvm_library(LLVMOrcJIT
Legacy.cpp
Layer.cpp
NullResolver.cpp
ObjectTransformLayer.cpp
OrcABISupport.cpp
OrcCBindings.cpp
OrcError.cpp

View File

@ -0,0 +1,34 @@
//===---------- ObjectTransformLayer.cpp - Object 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/ObjectTransformLayer.h"
#include "llvm/Support/MemoryBuffer.h"
namespace llvm {
namespace orc {
ObjectTransformLayer2::ObjectTransformLayer2(ExecutionSession &ES,
ObjectLayer &BaseLayer,
TransformFunction Transform)
: ObjectLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
void ObjectTransformLayer2::emit(MaterializationResponsibility R, VModuleKey K,
std::unique_ptr<MemoryBuffer> O) {
assert(O && "Module must not be null");
if (auto TransformedObj = Transform(std::move(O)))
BaseLayer.emit(std::move(R), std::move(K), std::move(*TransformedObj));
else {
R.failMaterialization();
getExecutionSession().reportError(TransformedObj.takeError());
}
}
} // End namespace orc.
} // End namespace llvm.