diff options
author | Fabian Mora <fmora.dev@gmail.com> | 2024-01-15 12:10:14 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-15 12:10:14 -0500 |
commit | 01dbc5da336de0dc2dbba31900fbc9572f39443d (patch) | |
tree | 99b72dc590a8b595fec19775d4833bf0972ced68 | |
parent | 4aa04245e5c10508e287699f6299362af8530715 (diff) | |
download | llvm-01dbc5da336de0dc2dbba31900fbc9572f39443d.zip llvm-01dbc5da336de0dc2dbba31900fbc9572f39443d.tar.gz llvm-01dbc5da336de0dc2dbba31900fbc9572f39443d.tar.bz2 |
Reland [mlir][ExecutionEngine] Add support for global constructors and destructors #78070 (#78170)
This patch add support for executing global constructors and destructors
in the ExecutionEngine.
-rw-r--r-- | mlir/lib/ExecutionEngine/ExecutionEngine.cpp | 11 | ||||
-rw-r--r-- | mlir/test/mlir-cpu-runner/global-constructors.mlir | 33 |
2 files changed, 44 insertions, 0 deletions
diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp index 267ec23..19917ea 100644 --- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp @@ -219,6 +219,11 @@ ExecutionEngine::ExecutionEngine(bool enableObjectDump, } ExecutionEngine::~ExecutionEngine() { + // Execute the global destructors from the module being processed. + // TODO: Allow JIT deinitialize for AArch64. Currently there's a bug causing a + // crash for AArch64 see related issue #71963. + if (jit && !jit->getTargetTriple().isAArch64()) + llvm::consumeError(jit->deinitialize(jit->getMainJITDylib())); // Run all dynamic library destroy callbacks to prepare for the shutdown. for (LibraryDestroyFn destroy : destroyFns) destroy(); @@ -396,6 +401,12 @@ ExecutionEngine::create(Operation *m, const ExecutionEngineOptions &options, }; engine->registerSymbols(runtimeSymbolMap); + // Execute the global constructors from the module being processed. + // TODO: Allow JIT initialize for AArch64. Currently there's a bug causing a + // crash for AArch64 see related issue #71963. + if (!engine->jit->getTargetTriple().isAArch64()) + cantFail(engine->jit->initialize(engine->jit->getMainJITDylib())); + return std::move(engine); } diff --git a/mlir/test/mlir-cpu-runner/global-constructors.mlir b/mlir/test/mlir-cpu-runner/global-constructors.mlir new file mode 100644 index 0000000..fe1fe06 --- /dev/null +++ b/mlir/test/mlir-cpu-runner/global-constructors.mlir @@ -0,0 +1,33 @@ +// UNSUPPORTED: target=aarch64{{.*}} +// RUN: mlir-cpu-runner %s -e entry -entry-point-result=void \ +// RUN: -shared-libs=%mlir_c_runner_utils | \ +// RUN: FileCheck %s + +// Test that the `ctor` executes before `entry` and that `dtor` executes last. +module { + llvm.func @printNewline() + llvm.func @printI64(i64) + llvm.mlir.global_ctors {ctors = [@ctor], priorities = [0 : i32]} + llvm.mlir.global_dtors {dtors = [@dtor], priorities = [0 : i32]} + llvm.func @ctor() { + %0 = llvm.mlir.constant(1 : i64) : i64 + llvm.call @printI64(%0) : (i64) -> () + llvm.call @printNewline() : () -> () + // CHECK: 1 + llvm.return + } + llvm.func @entry() { + %0 = llvm.mlir.constant(2 : i64) : i64 + llvm.call @printI64(%0) : (i64) -> () + llvm.call @printNewline() : () -> () + // CHECK: 2 + llvm.return + } + llvm.func @dtor() { + %0 = llvm.mlir.constant(3 : i64) : i64 + llvm.call @printI64(%0) : (i64) -> () + llvm.call @printNewline() : () -> () + // CHECK: 3 + llvm.return + } +} |