186c8a785SMehdi Amini //===- ExecutionEngine.cpp - C API for MLIR JIT ---------------------------===// 286c8a785SMehdi Amini // 386c8a785SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 486c8a785SMehdi Amini // See https://llvm.org/LICENSE.txt for license information. 586c8a785SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 686c8a785SMehdi Amini // 786c8a785SMehdi Amini //===----------------------------------------------------------------------===// 886c8a785SMehdi Amini 986c8a785SMehdi Amini #include "mlir-c/ExecutionEngine.h" 1086c8a785SMehdi Amini #include "mlir/CAPI/ExecutionEngine.h" 1186c8a785SMehdi Amini #include "mlir/CAPI/IR.h" 1286c8a785SMehdi Amini #include "mlir/CAPI/Support.h" 1319db802eSAlex Zinenko #include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h" 147a4d6307SMehdi Amini #include "llvm/ExecutionEngine/Orc/Mangling.h" 1586c8a785SMehdi Amini #include "llvm/Support/TargetSelect.h" 1686c8a785SMehdi Amini 1786c8a785SMehdi Amini using namespace mlir; 1886c8a785SMehdi Amini 1986c8a785SMehdi Amini extern "C" MlirExecutionEngine mlirExecutionEngineCreate(MlirModule op) { 2086c8a785SMehdi Amini static bool init_once = [] { 2186c8a785SMehdi Amini llvm::InitializeNativeTarget(); 2286c8a785SMehdi Amini llvm::InitializeNativeTargetAsmPrinter(); 2386c8a785SMehdi Amini return true; 2486c8a785SMehdi Amini }(); 2586c8a785SMehdi Amini (void)init_once; 2686c8a785SMehdi Amini 2713cb4317SMehdi Amini mlir::registerLLVMDialectTranslation(*unwrap(op)->getContext()); 2886c8a785SMehdi Amini auto jitOrError = ExecutionEngine::create(unwrap(op)); 2986c8a785SMehdi Amini if (!jitOrError) { 3086c8a785SMehdi Amini consumeError(jitOrError.takeError()); 3186c8a785SMehdi Amini return MlirExecutionEngine{nullptr}; 3286c8a785SMehdi Amini } 3386c8a785SMehdi Amini return wrap(jitOrError->release()); 3486c8a785SMehdi Amini } 3586c8a785SMehdi Amini 3686c8a785SMehdi Amini extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) { 3786c8a785SMehdi Amini delete (unwrap(jit)); 3886c8a785SMehdi Amini } 3986c8a785SMehdi Amini 4086c8a785SMehdi Amini extern "C" MlirLogicalResult 4186c8a785SMehdi Amini mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name, 4286c8a785SMehdi Amini void **arguments) { 4386c8a785SMehdi Amini const std::string ifaceName = ("_mlir_ciface_" + unwrap(name)).str(); 4486c8a785SMehdi Amini llvm::Error error = unwrap(jit)->invokePacked( 4586c8a785SMehdi Amini ifaceName, MutableArrayRef<void *>{arguments, (size_t)0}); 4686c8a785SMehdi Amini if (error) 4786c8a785SMehdi Amini return wrap(failure()); 4886c8a785SMehdi Amini return wrap(success()); 4986c8a785SMehdi Amini } 5013cb4317SMehdi Amini 5113cb4317SMehdi Amini extern "C" void *mlirExecutionEngineLookup(MlirExecutionEngine jit, 5213cb4317SMehdi Amini MlirStringRef name) { 5313cb4317SMehdi Amini auto expectedFPtr = unwrap(jit)->lookup(unwrap(name)); 5413cb4317SMehdi Amini if (!expectedFPtr) 5513cb4317SMehdi Amini return nullptr; 5613cb4317SMehdi Amini return reinterpret_cast<void *>(*expectedFPtr); 5713cb4317SMehdi Amini } 587a4d6307SMehdi Amini 597a4d6307SMehdi Amini extern "C" void mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, 607a4d6307SMehdi Amini MlirStringRef name, 617a4d6307SMehdi Amini void *sym) { 627a4d6307SMehdi Amini unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) { 637a4d6307SMehdi Amini llvm::orc::SymbolMap symbolMap; 647a4d6307SMehdi Amini symbolMap[interner(unwrap(name))] = 657a4d6307SMehdi Amini llvm::JITEvaluatedSymbol::fromPointer(sym); 667a4d6307SMehdi Amini return symbolMap; 677a4d6307SMehdi Amini }); 687a4d6307SMehdi Amini } 69*1dc533ceSNicolas Vasilache 70*1dc533ceSNicolas Vasilache extern "C" void mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit, 71*1dc533ceSNicolas Vasilache MlirStringRef name) { 72*1dc533ceSNicolas Vasilache unwrap(jit)->dumpToObjectFile(unwrap(name)); 73*1dc533ceSNicolas Vasilache } 74