185642262SLang Hames //===---------- ObjectTransformLayer.cpp - Object Transform Layer ---------===//
285642262SLang Hames //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
685642262SLang Hames //
785642262SLang Hames //===----------------------------------------------------------------------===//
885642262SLang Hames
985642262SLang Hames #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
1085642262SLang Hames #include "llvm/Support/MemoryBuffer.h"
1185642262SLang Hames
1285642262SLang Hames namespace llvm {
1385642262SLang Hames namespace orc {
1485642262SLang Hames
15*406ef36bSStefan Gränitz char ObjectTransformLayer::ID;
16*406ef36bSStefan Gränitz
17*406ef36bSStefan Gränitz using BaseT = RTTIExtends<ObjectTransformLayer, ObjectLayer>;
18*406ef36bSStefan Gränitz
ObjectTransformLayer(ExecutionSession & ES,ObjectLayer & BaseLayer,TransformFunction Transform)19079df9abSLang Hames ObjectTransformLayer::ObjectTransformLayer(ExecutionSession &ES,
2085642262SLang Hames ObjectLayer &BaseLayer,
2185642262SLang Hames TransformFunction Transform)
22*406ef36bSStefan Gränitz : BaseT(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
2385642262SLang Hames
emit(std::unique_ptr<MaterializationResponsibility> R,std::unique_ptr<MemoryBuffer> O)247dcd0042SLang Hames void ObjectTransformLayer::emit(
257dcd0042SLang Hames std::unique_ptr<MaterializationResponsibility> R,
2685642262SLang Hames std::unique_ptr<MemoryBuffer> O) {
2785642262SLang Hames assert(O && "Module must not be null");
2885642262SLang Hames
2916f38ddaSLang Hames // If there is a transform set then apply it.
3016f38ddaSLang Hames if (Transform) {
3185642262SLang Hames if (auto TransformedObj = Transform(std::move(O)))
3216f38ddaSLang Hames O = std::move(*TransformedObj);
3385642262SLang Hames else {
347dcd0042SLang Hames R->failMaterialization();
3585642262SLang Hames getExecutionSession().reportError(TransformedObj.takeError());
3616f38ddaSLang Hames return;
3785642262SLang Hames }
3885642262SLang Hames }
3985642262SLang Hames
4016f38ddaSLang Hames BaseLayer.emit(std::move(R), std::move(O));
4116f38ddaSLang Hames }
4216f38ddaSLang Hames
4385642262SLang Hames } // End namespace orc.
4485642262SLang Hames } // End namespace llvm.
45