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