aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mora <fmora.dev@gmail.com>2024-01-15 12:10:14 -0500
committerGitHub <noreply@github.com>2024-01-15 12:10:14 -0500
commit01dbc5da336de0dc2dbba31900fbc9572f39443d (patch)
tree99b72dc590a8b595fec19775d4833bf0972ced68
parent4aa04245e5c10508e287699f6299362af8530715 (diff)
downloadllvm-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.cpp11
-rw-r--r--mlir/test/mlir-cpu-runner/global-constructors.mlir33
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
+ }
+}