diff --git a/crates/cuda_std/src/shared.rs b/crates/cuda_std/src/shared.rs index 3bfab456..db7557a8 100644 --- a/crates/cuda_std/src/shared.rs +++ b/crates/cuda_std/src/shared.rs @@ -20,7 +20,7 @@ pub fn dynamic_shared_mem() -> *mut T { #[allow(improper_ctypes)] // mangle it a bit to make sure nobody makes the same thing #[link_name = "_Zcuda_std_dyn_shared"] - static DYN_SHARED: ::core::cell::UnsafeCell; + static DYN_SHARED: ::core::cell::UnsafeCell<[u128; 0]>; } // SAFETY: extern statics is how dynamic shared mem is done in CUDA. This will turn into diff --git a/tests/compiletests/ui/dis/dynamic_shared_mem.rs b/tests/compiletests/ui/dis/dynamic_shared_mem.rs new file mode 100644 index 00000000..16e65fd9 --- /dev/null +++ b/tests/compiletests/ui/dis/dynamic_shared_mem.rs @@ -0,0 +1,16 @@ +// build-pass +// compile-flags: -Cllvm-args=--disassemble-globals --error-format=human -Cdebuginfo=0 +// normalize-stderr-test "sm_\d+" -> "sm_XX" + +// Regression test: the extern behind `dynamic_shared_mem` must be unsized (`[]`) in the PTX, +// like nvcc's `extern __shared__` arrays. A sized one is laid out among the kernel's static +// shared variables, so the dynamic region overlaps them. + +use cuda_std::{kernel, shared}; + +#[kernel] +pub unsafe fn dynamic_shared(out: *mut u32) { + unsafe { + *out = *shared::dynamic_shared_mem::(); + } +} diff --git a/tests/compiletests/ui/dis/dynamic_shared_mem.stderr b/tests/compiletests/ui/dis/dynamic_shared_mem.stderr new file mode 100644 index 00000000..c403c001 --- /dev/null +++ b/tests/compiletests/ui/dis/dynamic_shared_mem.stderr @@ -0,0 +1,7 @@ +.version 8.7 +.target sm_XX +.address_size 64 +.extern .shared .align 16 .b8 _Zcuda_std_dyn_shared[]; +.visible .entry dynamic_shared( { ... } + +