| // Test argument and return type restrictions of the gpu-kernel ABI and |
| // check for warnings on mangled gpu-kernels. |
| |
| //@ check-pass |
| //@ ignore-backends: gcc |
| //@ revisions: amdgpu nvptx |
| //@ add-minicore |
| //@ edition: 2024 |
| //@[amdgpu] compile-flags: --target amdgcn-amd-amdhsa -Ctarget-cpu=gfx900 |
| //@[amdgpu] needs-llvm-components: amdgpu |
| //@[nvptx] compile-flags: --target nvptx64-nvidia-cuda |
| //@[nvptx] needs-llvm-components: nvptx |
| |
| #![feature(no_core, abi_gpu_kernel)] |
| #![no_core] |
| #![crate_type = "lib"] |
| |
| extern crate minicore; |
| use minicore::*; |
| |
| // Return types can be () or ! |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn ret_empty() {} |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn ret_never() -> ! { loop {} } |
| |
| // Arguments can be scalars or pointers |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_i32(_: i32) { } |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_ptr(_: *const i32) { } |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_ptr_mut(_: *mut i32) { } |
| |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_zst(_: ()) { } |
| //~^ WARN passing type `()` to a function with "gpu-kernel" ABI may have unexpected behavior |
| //~^^ WARN `extern` fn uses type `()`, which is not FFI-safe |
| |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_ref(_: &i32) { } |
| //~^ WARN passing type `&i32` to a function with "gpu-kernel" ABI may have unexpected behavior |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_ref_mut(_: &mut i32) { } |
| //~^ WARN passing type `&mut i32` to a function with "gpu-kernel" ABI may have unexpected behavior |
| |
| struct S { a: i32, b: i32 } |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_struct(_: S) { } |
| //~^ WARN passing type `S` to a function with "gpu-kernel" ABI may have unexpected behavior |
| //~^^ WARN `extern` fn uses type `S`, which is not FFI-safe |
| |
| #[unsafe(no_mangle)] |
| extern "gpu-kernel" fn arg_tup(_: (i32, i32)) { } |
| //~^ WARN passing type `(i32, i32)` to a function with "gpu-kernel" ABI may have unexpected behavior |
| //~^^ WARN `extern` fn uses type `(i32, i32)`, which is not FFI-safe |
| |
| #[unsafe(export_name = "kernel")] |
| pub extern "gpu-kernel" fn allowed_kernel_name() {} |
| |
| pub extern "gpu-kernel" fn mangled_kernel() { } |
| //~^ WARN function with the "gpu-kernel" ABI has a mangled name |