xref: /llvm-project/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp (revision 557a0ea8aff31de1cc337bd3819f015338f7d553)
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"
13185ce8cdSUday Bondhugula #include "mlir/ExecutionEngine/OptUtils.h"
140e9523efSSergio Afonso #include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
1519db802eSAlex Zinenko #include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
167a4d6307SMehdi Amini #include "llvm/ExecutionEngine/Orc/Mangling.h"
1786c8a785SMehdi Amini #include "llvm/Support/TargetSelect.h"
1886c8a785SMehdi Amini 
1986c8a785SMehdi Amini using namespace mlir;
2086c8a785SMehdi Amini 
21c8b8e8e0SUday Bondhugula extern "C" MlirExecutionEngine
22c8b8e8e0SUday Bondhugula mlirExecutionEngineCreate(MlirModule op, int optLevel, int numPaths,
2395c083f5SDenys Shabalin                           const MlirStringRef *sharedLibPaths,
2495c083f5SDenys Shabalin                           bool enableObjectDump) {
25185ce8cdSUday Bondhugula   static bool initOnce = [] {
2686c8a785SMehdi Amini     llvm::InitializeNativeTarget();
27050cc1cdSNicolas Vasilache     llvm::InitializeNativeTargetAsmParser(); // needed for inline_asm
2886c8a785SMehdi Amini     llvm::InitializeNativeTargetAsmPrinter();
2986c8a785SMehdi Amini     return true;
3086c8a785SMehdi Amini   }();
31185ce8cdSUday Bondhugula   (void)initOnce;
3286c8a785SMehdi Amini 
330e9523efSSergio Afonso   auto &ctx = *unwrap(op)->getContext();
340e9523efSSergio Afonso   mlir::registerBuiltinDialectTranslation(ctx);
350e9523efSSergio Afonso   mlir::registerLLVMDialectTranslation(ctx);
36185ce8cdSUday Bondhugula 
37185ce8cdSUday Bondhugula   auto tmBuilderOrError = llvm::orc::JITTargetMachineBuilder::detectHost();
38185ce8cdSUday Bondhugula   if (!tmBuilderOrError) {
39185ce8cdSUday Bondhugula     llvm::errs() << "Failed to create a JITTargetMachineBuilder for the host\n";
40185ce8cdSUday Bondhugula     return MlirExecutionEngine{nullptr};
41185ce8cdSUday Bondhugula   }
42185ce8cdSUday Bondhugula   auto tmOrError = tmBuilderOrError->createTargetMachine();
43185ce8cdSUday Bondhugula   if (!tmOrError) {
44185ce8cdSUday Bondhugula     llvm::errs() << "Failed to create a TargetMachine for the host\n";
45185ce8cdSUday Bondhugula     return MlirExecutionEngine{nullptr};
46185ce8cdSUday Bondhugula   }
47185ce8cdSUday Bondhugula 
48c8b8e8e0SUday Bondhugula   SmallVector<StringRef> libPaths;
49c8b8e8e0SUday Bondhugula   for (unsigned i = 0; i < static_cast<unsigned>(numPaths); ++i)
50c8b8e8e0SUday Bondhugula     libPaths.push_back(sharedLibPaths[i].data);
51c8b8e8e0SUday Bondhugula 
52185ce8cdSUday Bondhugula   // Create a transformer to run all LLVM optimization passes at the
53185ce8cdSUday Bondhugula   // specified optimization level.
54185ce8cdSUday Bondhugula   auto llvmOptLevel = static_cast<llvm::CodeGenOpt::Level>(optLevel);
557ccd026cSArthur Eubanks   auto transformer = mlir::makeOptimizingTransformer(
567ccd026cSArthur Eubanks       llvmOptLevel, /*sizeLevel=*/0, /*targetMachine=*/tmOrError->get());
57a7db3c61SEmilio Cota   ExecutionEngineOptions jitOptions;
58a7db3c61SEmilio Cota   jitOptions.transformer = transformer;
59a7db3c61SEmilio Cota   jitOptions.jitCodeGenOptLevel = llvmOptLevel;
60a7db3c61SEmilio Cota   jitOptions.sharedLibPaths = libPaths;
6195c083f5SDenys Shabalin   jitOptions.enableObjectDump = enableObjectDump;
62a7db3c61SEmilio Cota   auto jitOrError = ExecutionEngine::create(unwrap(op), jitOptions);
6386c8a785SMehdi Amini   if (!jitOrError) {
6486c8a785SMehdi Amini     consumeError(jitOrError.takeError());
6586c8a785SMehdi Amini     return MlirExecutionEngine{nullptr};
6686c8a785SMehdi Amini   }
6786c8a785SMehdi Amini   return wrap(jitOrError->release());
6886c8a785SMehdi Amini }
6986c8a785SMehdi Amini 
7086c8a785SMehdi Amini extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) {
7186c8a785SMehdi Amini   delete (unwrap(jit));
7286c8a785SMehdi Amini }
7386c8a785SMehdi Amini 
7486c8a785SMehdi Amini extern "C" MlirLogicalResult
7586c8a785SMehdi Amini mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name,
7686c8a785SMehdi Amini                                 void **arguments) {
7786c8a785SMehdi Amini   const std::string ifaceName = ("_mlir_ciface_" + unwrap(name)).str();
7886c8a785SMehdi Amini   llvm::Error error = unwrap(jit)->invokePacked(
7986c8a785SMehdi Amini       ifaceName, MutableArrayRef<void *>{arguments, (size_t)0});
8086c8a785SMehdi Amini   if (error)
8186c8a785SMehdi Amini     return wrap(failure());
8286c8a785SMehdi Amini   return wrap(success());
8386c8a785SMehdi Amini }
8413cb4317SMehdi Amini 
85106f3074STres Popp extern "C" void *mlirExecutionEngineLookupPacked(MlirExecutionEngine jit,
86106f3074STres Popp                                                  MlirStringRef name) {
87106f3074STres Popp   auto expectedFPtr = unwrap(jit)->lookupPacked(unwrap(name));
88106f3074STres Popp   if (!expectedFPtr)
89106f3074STres Popp     return nullptr;
90106f3074STres Popp   return reinterpret_cast<void *>(*expectedFPtr);
91106f3074STres Popp }
92106f3074STres Popp 
9313cb4317SMehdi Amini extern "C" void *mlirExecutionEngineLookup(MlirExecutionEngine jit,
9413cb4317SMehdi Amini                                            MlirStringRef name) {
9513cb4317SMehdi Amini   auto expectedFPtr = unwrap(jit)->lookup(unwrap(name));
9613cb4317SMehdi Amini   if (!expectedFPtr)
9713cb4317SMehdi Amini     return nullptr;
9813cb4317SMehdi Amini   return reinterpret_cast<void *>(*expectedFPtr);
9913cb4317SMehdi Amini }
1007a4d6307SMehdi Amini 
1017a4d6307SMehdi Amini extern "C" void mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit,
1027a4d6307SMehdi Amini                                                   MlirStringRef name,
1037a4d6307SMehdi Amini                                                   void *sym) {
1047a4d6307SMehdi Amini   unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) {
1057a4d6307SMehdi Amini     llvm::orc::SymbolMap symbolMap;
1067a4d6307SMehdi Amini     symbolMap[interner(unwrap(name))] =
107*557a0ea8SLang Hames         { llvm::orc::ExecutorAddr::fromPtr(sym),
108*557a0ea8SLang Hames           llvm::JITSymbolFlags::Exported };
1097a4d6307SMehdi Amini     return symbolMap;
1107a4d6307SMehdi Amini   });
1117a4d6307SMehdi Amini }
1121dc533ceSNicolas Vasilache 
1131dc533ceSNicolas Vasilache extern "C" void mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit,
1141dc533ceSNicolas Vasilache                                                     MlirStringRef name) {
1151dc533ceSNicolas Vasilache   unwrap(jit)->dumpToObjectFile(unwrap(name));
1161dc533ceSNicolas Vasilache }
117