2021-02-14 03:23:06 +08:00
|
|
|
//===-- mlir-c/ExecutionEngine.h - Execution engine management ---*- C -*-====//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM
|
|
|
|
// Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This header provides basic access to the MLIR JIT. This is minimalist and
|
|
|
|
// experimental at the moment.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef MLIR_C_EXECUTIONENGINE_H
|
|
|
|
#define MLIR_C_EXECUTIONENGINE_H
|
|
|
|
|
|
|
|
#include "mlir-c/IR.h"
|
|
|
|
#include "mlir-c/Support.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define DEFINE_C_API_STRUCT(name, storage) \
|
|
|
|
struct name { \
|
|
|
|
storage *ptr; \
|
|
|
|
}; \
|
|
|
|
typedef struct name name
|
|
|
|
|
|
|
|
DEFINE_C_API_STRUCT(MlirExecutionEngine, void);
|
|
|
|
|
|
|
|
#undef DEFINE_C_API_STRUCT
|
|
|
|
|
|
|
|
/// Creates an ExecutionEngine for the provided ModuleOp. The ModuleOp is
|
|
|
|
/// expected to be "translatable" to LLVM IR (only contains operations in
|
|
|
|
/// dialects that implement the `LLVMTranslationDialectInterface`). The module
|
|
|
|
/// ownership stays with the client and can be destroyed as soon as the call
|
2021-05-05 10:44:31 +08:00
|
|
|
/// returns. `optLevel` is the optimization level to be used for transformation
|
|
|
|
/// and code generation. LLVM passes at `optLevel` are run before code
|
2021-06-05 22:24:34 +08:00
|
|
|
/// generation. The number and array of paths corresponding to shared libraries
|
|
|
|
/// that will be loaded are specified via `numPaths` and `sharedLibPaths`
|
|
|
|
/// respectively.
|
2021-05-05 10:44:31 +08:00
|
|
|
/// TODO: figure out other options.
|
2021-06-05 22:24:34 +08:00
|
|
|
MLIR_CAPI_EXPORTED MlirExecutionEngine
|
|
|
|
mlirExecutionEngineCreate(MlirModule op, int optLevel, int numPaths,
|
|
|
|
const MlirStringRef *sharedLibPaths);
|
2021-02-14 03:23:06 +08:00
|
|
|
|
|
|
|
/// Destroy an ExecutionEngine instance.
|
|
|
|
MLIR_CAPI_EXPORTED void mlirExecutionEngineDestroy(MlirExecutionEngine jit);
|
|
|
|
|
|
|
|
/// Checks whether an execution engine is null.
|
|
|
|
static inline bool mlirExecutionEngineIsNull(MlirExecutionEngine jit) {
|
|
|
|
return !jit.ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Invoke a native function in the execution engine by name with the arguments
|
|
|
|
/// and result of the invoked function passed as an array of pointers. The
|
|
|
|
/// function must have been tagged with the `llvm.emit_c_interface` attribute.
|
|
|
|
/// Returns a failure if the execution fails for any reason (the function name
|
|
|
|
/// can't be resolved for instance).
|
|
|
|
MLIR_CAPI_EXPORTED MlirLogicalResult mlirExecutionEngineInvokePacked(
|
|
|
|
MlirExecutionEngine jit, MlirStringRef name, void **arguments);
|
|
|
|
|
Rename MlirExecutionEngine lookup to lookupPacked
The purpose of the change is to make clear whether the user is
retrieving the original function or the wrapper function, in line with
the invoke commands. This new functionality is useful for users that
already have defined their own packed interface, so they do not want the
extra layer of indirection, or for users wanting to the look at the
resulting primary function rather than the wrapper function.
All locations, except the python bindings now have a `lookupPacked`
method that matches the original `lookup` functionality. `lookup`
still exists, but with new semantics.
- `lookup` returns the function with a given name. If `bool f(int,int)`
is compiled, `lookup` will return a reference to `bool(*f)(int,int)`.
- `lookupPacked` returns the packed wrapper of the function with the
given name. If `bool f(int,int)` is compiled, `lookupPacked` will return
`void(*mlir_f)(void**)`.
Differential Revision: https://reviews.llvm.org/D114352
2021-11-22 17:37:42 +08:00
|
|
|
/// Lookup the wrapper of the native function in the execution engine with the
|
|
|
|
/// given name, returns nullptr if the function can't be looked-up.
|
|
|
|
MLIR_CAPI_EXPORTED void *
|
|
|
|
mlirExecutionEngineLookupPacked(MlirExecutionEngine jit, MlirStringRef name);
|
|
|
|
|
2021-02-23 09:56:01 +08:00
|
|
|
/// Lookup a native function in the execution engine by name, returns nullptr
|
|
|
|
/// if the name can't be looked-up.
|
|
|
|
MLIR_CAPI_EXPORTED void *mlirExecutionEngineLookup(MlirExecutionEngine jit,
|
|
|
|
MlirStringRef name);
|
|
|
|
|
2021-03-30 12:35:36 +08:00
|
|
|
/// Register a symbol with the jit: this symbol will be accessible to the jitted
|
|
|
|
/// code.
|
|
|
|
MLIR_CAPI_EXPORTED void
|
|
|
|
mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, MlirStringRef name,
|
|
|
|
void *sym);
|
|
|
|
|
2021-04-20 03:30:29 +08:00
|
|
|
/// Dump as an object in `fileName`.
|
|
|
|
MLIR_CAPI_EXPORTED void
|
|
|
|
mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit,
|
|
|
|
MlirStringRef fileName);
|
|
|
|
|
2021-02-14 03:23:06 +08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-01-14 04:27:30 +08:00
|
|
|
#endif // MLIR_C_EXECUTIONENGINE_H
|