llvm-project/mlir/test/mlir-runner/global-constructors.mlir
Bruno Cardoso Lopes 7c3ecffe9b
[MLIR][LLVMIR] Add support for the full form of global_{ctor,dtor} (#133176)
Currently only ctor/dtor list and their priorities are supported. This
PR adds support for the missing data field.

Few implementation notes:
- The assembly printer has a fixed form because previous `attr_dict`
will sort the dict by key name, making global_dtor and global_ctor
differ in the order of printed arguments.
- LLVM's `ptr null` is being converted to `#llvm.zero` otherwise we'd
have to create a region to use the default operation conversion from
`ptr null`, which is silly given that the field only support null or a
symbol.
2025-03-27 14:11:05 -07:00

34 lines
1.0 KiB
MLIR

// UNSUPPORTED: target=aarch64{{.*}}, target=arm64{{.*}}
// RUN: mlir-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], data = [#llvm.zero]
llvm.mlir.global_dtors dtors = [@dtor], priorities = [0 : i32], data = [#llvm.zero]
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
}
}