xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ObjectTransformLayer.cpp (revision cfd6422a5217410fbd66f7a7a8a64d9d85e61229)
1 //===---------- ObjectTransformLayer.cpp - Object Transform Layer ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
10 #include "llvm/Support/MemoryBuffer.h"
11 
12 namespace llvm {
13 namespace orc {
14 
15 ObjectTransformLayer::ObjectTransformLayer(ExecutionSession &ES,
16                                             ObjectLayer &BaseLayer,
17                                             TransformFunction Transform)
18     : ObjectLayer(ES), BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
19 
20 void ObjectTransformLayer::emit(MaterializationResponsibility R,
21                                 std::unique_ptr<MemoryBuffer> O) {
22   assert(O && "Module must not be null");
23 
24   // If there is a transform set then apply it.
25   if (Transform) {
26     if (auto TransformedObj = Transform(std::move(O)))
27       O = std::move(*TransformedObj);
28     else {
29       R.failMaterialization();
30       getExecutionSession().reportError(TransformedObj.takeError());
31       return;
32     }
33   }
34 
35   BaseLayer.emit(std::move(R), std::move(O));
36 }
37 
38 } // End namespace orc.
39 } // End namespace llvm.
40