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" 13*185ce8cdSUday Bondhugula #include "mlir/ExecutionEngine/OptUtils.h" 1419db802eSAlex Zinenko #include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h" 157a4d6307SMehdi Amini #include "llvm/ExecutionEngine/Orc/Mangling.h" 1686c8a785SMehdi Amini #include "llvm/Support/TargetSelect.h" 1786c8a785SMehdi Amini 1886c8a785SMehdi Amini using namespace mlir; 1986c8a785SMehdi Amini 20*185ce8cdSUday Bondhugula extern "C" MlirExecutionEngine mlirExecutionEngineCreate(MlirModule op, 21*185ce8cdSUday Bondhugula int optLevel) { 22*185ce8cdSUday Bondhugula static bool initOnce = [] { 2386c8a785SMehdi Amini llvm::InitializeNativeTarget(); 2486c8a785SMehdi Amini llvm::InitializeNativeTargetAsmPrinter(); 2586c8a785SMehdi Amini return true; 2686c8a785SMehdi Amini }(); 27*185ce8cdSUday Bondhugula (void)initOnce; 2886c8a785SMehdi Amini 2913cb4317SMehdi Amini mlir::registerLLVMDialectTranslation(*unwrap(op)->getContext()); 30*185ce8cdSUday Bondhugula 31*185ce8cdSUday Bondhugula auto tmBuilderOrError = llvm::orc::JITTargetMachineBuilder::detectHost(); 32*185ce8cdSUday Bondhugula if (!tmBuilderOrError) { 33*185ce8cdSUday Bondhugula llvm::errs() << "Failed to create a JITTargetMachineBuilder for the host\n"; 34*185ce8cdSUday Bondhugula return MlirExecutionEngine{nullptr}; 35*185ce8cdSUday Bondhugula } 36*185ce8cdSUday Bondhugula auto tmOrError = tmBuilderOrError->createTargetMachine(); 37*185ce8cdSUday Bondhugula if (!tmOrError) { 38*185ce8cdSUday Bondhugula llvm::errs() << "Failed to create a TargetMachine for the host\n"; 39*185ce8cdSUday Bondhugula return MlirExecutionEngine{nullptr}; 40*185ce8cdSUday Bondhugula } 41*185ce8cdSUday Bondhugula 42*185ce8cdSUday Bondhugula // Create a transformer to run all LLVM optimization passes at the 43*185ce8cdSUday Bondhugula // specified optimization level. 44*185ce8cdSUday Bondhugula auto llvmOptLevel = static_cast<llvm::CodeGenOpt::Level>(optLevel); 45*185ce8cdSUday Bondhugula auto transformer = mlir::makeLLVMPassesTransformer( 46*185ce8cdSUday Bondhugula /*passes=*/{}, llvmOptLevel, /*targetMachine=*/tmOrError->get()); 47*185ce8cdSUday Bondhugula auto jitOrError = ExecutionEngine::create( 48*185ce8cdSUday Bondhugula unwrap(op), /*llvmModuleBuilder=*/{}, transformer, llvmOptLevel); 4986c8a785SMehdi Amini if (!jitOrError) { 5086c8a785SMehdi Amini consumeError(jitOrError.takeError()); 5186c8a785SMehdi Amini return MlirExecutionEngine{nullptr}; 5286c8a785SMehdi Amini } 5386c8a785SMehdi Amini return wrap(jitOrError->release()); 5486c8a785SMehdi Amini } 5586c8a785SMehdi Amini 5686c8a785SMehdi Amini extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) { 5786c8a785SMehdi Amini delete (unwrap(jit)); 5886c8a785SMehdi Amini } 5986c8a785SMehdi Amini 6086c8a785SMehdi Amini extern "C" MlirLogicalResult 6186c8a785SMehdi Amini mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name, 6286c8a785SMehdi Amini void **arguments) { 6386c8a785SMehdi Amini const std::string ifaceName = ("_mlir_ciface_" + unwrap(name)).str(); 6486c8a785SMehdi Amini llvm::Error error = unwrap(jit)->invokePacked( 6586c8a785SMehdi Amini ifaceName, MutableArrayRef<void *>{arguments, (size_t)0}); 6686c8a785SMehdi Amini if (error) 6786c8a785SMehdi Amini return wrap(failure()); 6886c8a785SMehdi Amini return wrap(success()); 6986c8a785SMehdi Amini } 7013cb4317SMehdi Amini 7113cb4317SMehdi Amini extern "C" void *mlirExecutionEngineLookup(MlirExecutionEngine jit, 7213cb4317SMehdi Amini MlirStringRef name) { 7313cb4317SMehdi Amini auto expectedFPtr = unwrap(jit)->lookup(unwrap(name)); 7413cb4317SMehdi Amini if (!expectedFPtr) 7513cb4317SMehdi Amini return nullptr; 7613cb4317SMehdi Amini return reinterpret_cast<void *>(*expectedFPtr); 7713cb4317SMehdi Amini } 787a4d6307SMehdi Amini 797a4d6307SMehdi Amini extern "C" void mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, 807a4d6307SMehdi Amini MlirStringRef name, 817a4d6307SMehdi Amini void *sym) { 827a4d6307SMehdi Amini unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) { 837a4d6307SMehdi Amini llvm::orc::SymbolMap symbolMap; 847a4d6307SMehdi Amini symbolMap[interner(unwrap(name))] = 857a4d6307SMehdi Amini llvm::JITEvaluatedSymbol::fromPointer(sym); 867a4d6307SMehdi Amini return symbolMap; 877a4d6307SMehdi Amini }); 887a4d6307SMehdi Amini } 891dc533ceSNicolas Vasilache 901dc533ceSNicolas Vasilache extern "C" void mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit, 911dc533ceSNicolas Vasilache MlirStringRef name) { 921dc533ceSNicolas Vasilache unwrap(jit)->dumpToObjectFile(unwrap(name)); 931dc533ceSNicolas Vasilache } 94