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 46 mlirExecutionEngineCreate(MlirModule op, int optLevel, int numPaths, 47 const MlirStringRef *sharedLibPaths); 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