17#include "llvm/ExecutionEngine/Orc/Mangling.h"
18#include "llvm/Support/TargetSelect.h"
22extern "C" MlirExecutionEngine
25 bool enableObjectDump,
bool enablePIC) {
26 static bool initOnce = [] {
27 llvm::InitializeNativeTarget();
28 llvm::InitializeNativeTargetAsmParser();
29 llvm::InitializeNativeTargetAsmPrinter();
34 auto &ctx = *
unwrap(op)->getContext();
39 auto tmBuilderOrError = llvm::orc::JITTargetMachineBuilder::detectHost();
40 if (!tmBuilderOrError) {
41 consumeError(tmBuilderOrError.takeError());
42 return MlirExecutionEngine{
nullptr};
45 tmBuilderOrError->setRelocationModel(llvm::Reloc::PIC_);
46 auto tmOrError = tmBuilderOrError->createTargetMachine();
48 consumeError(tmOrError.takeError());
49 return MlirExecutionEngine{
nullptr};
53 for (
unsigned i = 0; i < static_cast<unsigned>(numPaths); ++i)
54 libPaths.push_back(sharedLibPaths[i].
data);
59 optLevel, 0, tmOrError->get());
66 std::move(tmOrError.get()));
68 consumeError(jitOrError.takeError());
69 return MlirExecutionEngine{
nullptr};
71 return wrap(jitOrError->release());
85 const std::string ifaceName = (
"_mlir_ciface_" +
unwrap(name)).str();
86 llvm::Error error =
unwrap(jit)->invokePacked(
89 return wrap(failure());
96 llvm::expectedToOptional(
unwrap(jit)->lookupPacked(
unwrap(name)));
99 return reinterpret_cast<void *
>(*optionalFPtr);
105 llvm::expectedToOptional(
unwrap(jit)->lookup(
unwrap(name)));
108 return *optionalFPtr;
114 unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) {
115 llvm::orc::SymbolMap symbolMap;
116 symbolMap[interner(
unwrap(name))] = {llvm::orc::ExecutorAddr::fromPtr(sym),
117 llvm::JITSymbolFlags::Exported};
void mlirExecutionEngineDumpToObjectFile(MlirExecutionEngine jit, MlirStringRef name)
Dump as an object in fileName.
void mlirExecutionEngineInitialize(MlirExecutionEngine jit)
Initialize the ExecutionEngine.
MlirLogicalResult mlirExecutionEngineInvokePacked(MlirExecutionEngine jit, MlirStringRef name, void **arguments)
Invoke a native function in the execution engine by name with the arguments and result of the invoked...
void * mlirExecutionEngineLookupPacked(MlirExecutionEngine jit, MlirStringRef name)
Lookup the wrapper of the native function in the execution engine with the given name,...
void * mlirExecutionEngineLookup(MlirExecutionEngine jit, MlirStringRef name)
Lookup a native function in the execution engine by name, returns nullptr if the name can't be looked...
void mlirExecutionEngineDestroy(MlirExecutionEngine jit)
Destroy an ExecutionEngine instance.
MlirExecutionEngine mlirExecutionEngineCreate(MlirModule op, int optLevel, int numPaths, const MlirStringRef *sharedLibPaths, bool enableObjectDump, bool enablePIC)
Creates an ExecutionEngine for the provided ModuleOp.
void mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit, MlirStringRef name, void *sym)
Register a symbol with the jit: this symbol will be accessible to the jitted code.
static llvm::Expected< std::unique_ptr< ExecutionEngine > > create(Operation *op, const ExecutionEngineOptions &options={}, std::unique_ptr< llvm::TargetMachine > tm=nullptr)
Creates an execution engine for the given MLIR IR.
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Include the generated interface declarations.
std::function< llvm::Error(llvm::Module *)> makeOptimizingTransformer(unsigned optLevel, unsigned sizeLevel, llvm::TargetMachine *targetMachine)
Create a module transformer function for MLIR ExecutionEngine that runs LLVM IR passes corresponding ...
void registerOpenMPDialectTranslation(DialectRegistry ®istry)
Register the OpenMP dialect and the translation from it to the LLVM IR in the given registry;.
void registerBuiltinDialectTranslation(DialectRegistry ®istry)
Register the translation from the builtin dialect to the LLVM IR in the given registry.
void registerLLVMDialectTranslation(DialectRegistry ®istry)
Register the LLVM dialect and the translation from it to the LLVM IR in the given registry;.
A logical result value, essentially a boolean with named states.
A pointer to a sized fragment of a string, not necessarily null-terminated.
const char * data
Pointer to the first symbol.
std::optional< llvm::CodeGenOptLevel > jitCodeGenOptLevel
jitCodeGenOptLevel, when provided, is used as the optimization level for target code generation.
ArrayRef< StringRef > sharedLibPaths
If sharedLibPaths are provided, the underlying JIT-compilation will open and link the shared librarie...
bool enableObjectDump
If enableObjectCache is set, the JIT compiler will create one to store the object generated for the g...
llvm::function_ref< llvm::Error(llvm::Module *)> transformer
If transformer is provided, it will be called on the LLVM module during JIT-compilation and can be us...