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/ExecutionEngine/Orc/Mangling.h" 15 #include "llvm/Support/TargetSelect.h" 16 17 using namespace mlir; 18 19 extern "C" MlirExecutionEngine mlirExecutionEngineCreate(MlirModule op) { 20 static bool init_once = [] { 21 llvm::InitializeNativeTarget(); 22 llvm::InitializeNativeTargetAsmPrinter(); 23 return true; 24 }(); 25 (void)init_once; 26 27 mlir::registerLLVMDialectTranslation(*unwrap(op)->getContext()); 28 auto jitOrError = ExecutionEngine::create(unwrap(op)); 29 if (!jitOrError) { 30 consumeError(jitOrError.takeError()); 31 return MlirExecutionEngine{nullptr}; 32 } 33 return wrap(jitOrError->release()); 34 } 35 36 extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) { 37 delete (unwrap(jit)); 38 } 39 40 extern "C" MlirLogicalResult 41 mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name, 42 void **arguments) { 43 const std::string ifaceName = ("_mlir_ciface_" + unwrap(name)).str(); 44 llvm::Error error = unwrap(jit)->invokePacked( 45 ifaceName, MutableArrayRef<void *>{arguments, (size_t)0}); 46 if (error) 47 return wrap(failure()); 48 return wrap(success()); 49 } 50 51 extern "C" void *mlirExecutionEngineLookup(MlirExecutionEngine jit, 52 MlirStringRef name) { 53 auto expectedFPtr = unwrap(jit)->lookup(unwrap(name)); 54 if (!expectedFPtr) 55 return nullptr; 56 return reinterpret_cast<void *>(*expectedFPtr); 57 } 58 59 extern "C" void mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, 60 MlirStringRef name, 61 void *sym) { 62 unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) { 63 llvm::orc::SymbolMap symbolMap; 64 symbolMap[interner(unwrap(name))] = 65 llvm::JITEvaluatedSymbol::fromPointer(sym); 66 return symbolMap; 67 }); 68 } 69