1 | //===-- mlir-c/ExecutionEngine.h - Execution engine management ---*- C -*-====// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM |
4 | // Exceptions. |
5 | // See https://llvm.org/LICENSE.txt for license information. |
6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | // |
10 | // This header provides basic access to the MLIR JIT. This is minimalist and |
11 | // experimental at the moment. |
12 | // |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #ifndef MLIR_C_EXECUTIONENGINE_H |
16 | #define MLIR_C_EXECUTIONENGINE_H |
17 | |
18 | #include "mlir-c/IR.h" |
19 | #include "mlir-c/Support.h" |
20 | |
21 | #ifdef __cplusplus |
22 | extern "C" { |
23 | #endif |
24 | |
25 | #define DEFINE_C_API_STRUCT(name, storage) \ |
26 | struct name { \ |
27 | storage *ptr; \ |
28 | }; \ |
29 | typedef struct name name |
30 | |
31 | DEFINE_C_API_STRUCT(MlirExecutionEngine, void); |
32 | |
33 | #undef DEFINE_C_API_STRUCT |
34 | |
35 | /// Creates an ExecutionEngine for the provided ModuleOp. The ModuleOp is |
36 | /// expected to be "translatable" to LLVM IR (only contains operations in |
37 | /// dialects that implement the `LLVMTranslationDialectInterface`). The module |
38 | /// ownership stays with the client and can be destroyed as soon as the call |
39 | /// returns. `optLevel` is the optimization level to be used for transformation |
40 | /// and code generation. LLVM passes at `optLevel` are run before code |
41 | /// generation. The number and array of paths corresponding to shared libraries |
42 | /// that will be loaded are specified via `numPaths` and `sharedLibPaths` |
43 | /// respectively. |
44 | /// TODO: figure out other options. |
45 | MLIR_CAPI_EXPORTED MlirExecutionEngine mlirExecutionEngineCreate( |
46 | MlirModule op, int optLevel, int numPaths, |
47 | const MlirStringRef *sharedLibPaths, bool enableObjectDump); |
48 | |
49 | /// Destroy an ExecutionEngine instance. |
50 | MLIR_CAPI_EXPORTED void mlirExecutionEngineDestroy(MlirExecutionEngine jit); |
51 | |
52 | /// Checks whether an execution engine is null. |
53 | static inline bool mlirExecutionEngineIsNull(MlirExecutionEngine jit) { |
54 | return !jit.ptr; |
55 | } |
56 | |
57 | /// Invoke a native function in the execution engine by name with the arguments |
58 | /// and result of the invoked function passed as an array of pointers. The |
59 | /// function must have been tagged with the `llvm.emit_c_interface` attribute. |
60 | /// Returns a failure if the execution fails for any reason (the function name |
61 | /// can't be resolved for instance). |
62 | MLIR_CAPI_EXPORTED MlirLogicalResult mlirExecutionEngineInvokePacked( |
63 | MlirExecutionEngine jit, MlirStringRef name, void **arguments); |
64 | |
65 | /// Lookup the wrapper of the native function in the execution engine with the |
66 | /// given name, returns nullptr if the function can't be looked-up. |
67 | MLIR_CAPI_EXPORTED void * |
68 | mlirExecutionEngineLookupPacked(MlirExecutionEngine jit, MlirStringRef name); |
69 | |
70 | /// Lookup a native function in the execution engine by name, returns nullptr |
71 | /// if the name can't be looked-up. |
72 | MLIR_CAPI_EXPORTED void *mlirExecutionEngineLookup(MlirExecutionEngine jit, |
73 | MlirStringRef name); |
74 | |
75 | /// Register a symbol with the jit: this symbol will be accessible to the jitted |
76 | /// code. |
77 | MLIR_CAPI_EXPORTED void |
78 | mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, MlirStringRef name, |
79 | void *sym); |
80 | |
81 | /// Dump as an object in `fileName`. |
82 | MLIR_CAPI_EXPORTED void |
83 | mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit, |
84 | MlirStringRef fileName); |
85 | |
86 | #ifdef __cplusplus |
87 | } |
88 | #endif |
89 | |
90 | #endif // MLIR_C_EXECUTIONENGINE_H |
91 | |