1*86c8a785SMehdi Amini //===- ExecutionEngine.cpp - C API for MLIR JIT ---------------------------===//
2*86c8a785SMehdi Amini //
3*86c8a785SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*86c8a785SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
5*86c8a785SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*86c8a785SMehdi Amini //
7*86c8a785SMehdi Amini //===----------------------------------------------------------------------===//
8*86c8a785SMehdi Amini 
9*86c8a785SMehdi Amini #include "mlir-c/ExecutionEngine.h"
10*86c8a785SMehdi Amini #include "mlir/CAPI/ExecutionEngine.h"
11*86c8a785SMehdi Amini #include "mlir/CAPI/IR.h"
12*86c8a785SMehdi Amini #include "mlir/CAPI/Support.h"
13*86c8a785SMehdi Amini #include "llvm/Support/TargetSelect.h"
14*86c8a785SMehdi Amini 
15*86c8a785SMehdi Amini using namespace mlir;
16*86c8a785SMehdi Amini 
17*86c8a785SMehdi Amini extern "C" MlirExecutionEngine mlirExecutionEngineCreate(MlirModule op) {
18*86c8a785SMehdi Amini   static bool init_once = [] {
19*86c8a785SMehdi Amini     llvm::InitializeNativeTarget();
20*86c8a785SMehdi Amini     llvm::InitializeNativeTargetAsmPrinter();
21*86c8a785SMehdi Amini     return true;
22*86c8a785SMehdi Amini   }();
23*86c8a785SMehdi Amini   (void)init_once;
24*86c8a785SMehdi Amini 
25*86c8a785SMehdi Amini   auto jitOrError = ExecutionEngine::create(unwrap(op));
26*86c8a785SMehdi Amini   if (!jitOrError) {
27*86c8a785SMehdi Amini     consumeError(jitOrError.takeError());
28*86c8a785SMehdi Amini     return MlirExecutionEngine{nullptr};
29*86c8a785SMehdi Amini   }
30*86c8a785SMehdi Amini   return wrap(jitOrError->release());
31*86c8a785SMehdi Amini }
32*86c8a785SMehdi Amini 
33*86c8a785SMehdi Amini extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) {
34*86c8a785SMehdi Amini   delete (unwrap(jit));
35*86c8a785SMehdi Amini }
36*86c8a785SMehdi Amini 
37*86c8a785SMehdi Amini extern "C" MlirLogicalResult
38*86c8a785SMehdi Amini mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name,
39*86c8a785SMehdi Amini                                 void **arguments) {
40*86c8a785SMehdi Amini   const std::string ifaceName = ("_mlir_ciface_" + unwrap(name)).str();
41*86c8a785SMehdi Amini   llvm::Error error = unwrap(jit)->invokePacked(
42*86c8a785SMehdi Amini       ifaceName, MutableArrayRef<void *>{arguments, (size_t)0});
43*86c8a785SMehdi Amini   if (error)
44*86c8a785SMehdi Amini     return wrap(failure());
45*86c8a785SMehdi Amini   return wrap(success());
46*86c8a785SMehdi Amini }
47