xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp (revision 406ef36b03f911014018ba7ee1d3259567b14575)
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