xref: /llvm-project/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp (revision 185ce8cdfc7dba6cb6611b04346bfa03d008d5bf)
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