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 
15079df9abSLang Hames ObjectTransformLayer::ObjectTransformLayer(ExecutionSession &ES,
1685642262SLang Hames                                             ObjectLayer &BaseLayer,
1785642262SLang Hames                                             TransformFunction Transform)
1885642262SLang Hames     : ObjectLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
1985642262SLang Hames 
20*7dcd0042SLang Hames void ObjectTransformLayer::emit(
21*7dcd0042SLang Hames     std::unique_ptr<MaterializationResponsibility> R,
2285642262SLang Hames     std::unique_ptr<MemoryBuffer> O) {
2385642262SLang Hames   assert(O && "Module must not be null");
2485642262SLang Hames 
2516f38ddaSLang Hames   // If there is a transform set then apply it.
2616f38ddaSLang Hames   if (Transform) {
2785642262SLang Hames     if (auto TransformedObj = Transform(std::move(O)))
2816f38ddaSLang Hames       O = std::move(*TransformedObj);
2985642262SLang Hames     else {
30*7dcd0042SLang Hames       R->failMaterialization();
3185642262SLang Hames       getExecutionSession().reportError(TransformedObj.takeError());
3216f38ddaSLang Hames       return;
3385642262SLang Hames     }
3485642262SLang Hames   }
3585642262SLang Hames 
3616f38ddaSLang Hames   BaseLayer.emit(std::move(R), std::move(O));
3716f38ddaSLang Hames }
3816f38ddaSLang Hames 
3985642262SLang Hames } // End namespace orc.
4085642262SLang Hames } // End namespace llvm.
41