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