pub enum LoweredArg {
I32(i32),
I64(i64),
F32(f32),
F64(f64),
U32(u32),
U64(u64),
#[non_exhaustive] Ptr {
host_ptr: *const u8,
len: u32,
guest_offset: u32,
},
}Expand description
A single fully-parsed and bounds-checked kernel argument.
LoweredArg is the host-side representation that flows into
cuLaunchKernel (via build_kernel_param_storage) on CUDA builds
and is recorded for inspection on no-CUDA builds.
Variants§
I32(i32)
32-bit signed scalar.
I64(i64)
64-bit signed scalar.
F32(f32)
32-bit float scalar.
F64(f64)
64-bit float scalar.
U32(u32)
32-bit unsigned scalar.
U64(u64)
64-bit unsigned scalar.
#[non_exhaustive]Ptr
Pointer argument: a fully bounds-checked host pointer plus the declared byte length and the original guest-memory offset.
host_ptr is a raw pointer into the caller’s linear memory; under
CUDA Unified Memory it is also a valid device address. The
guest_offset field is preserved for log lines / tests so a
pointer arg round-trips losslessly through parsing.
#[non_exhaustive] blocks external struct-literal construction
— out-of-crate callers cannot stamp a LoweredArg::Ptr { ... }
expression with an arbitrary host_ptr. The launch path itself,
which lives inside this crate, retains full construction rights;
integration tests author pointer args via
LoweredArg::ptr_for_encoding (null placeholder pointer the
parser overwrites with the resolved one). This is defence-in-
depth on top of the comment that the field is “treat as opaque”:
a guest-driven memory.grow between launch and any embedder
readback can dangle the host pointer, so the only safe consumer
is the launch path. Embedders observing the parsed argv take a
pointer-free LoweredArgSnapshot via
crate::host::WasiCudaContext::last_lowered_args.
Pattern-matching still works for external consumers using the
.. rest pattern (LoweredArg::Ptr { guest_offset, len, .. });
the rest pattern intentionally hides host_ptr at the public
boundary.
Fields
This variant is marked as non-exhaustive
host_ptr: *const u8Host-side raw pointer into the caller’s linear memory.
Treat as opaque — dereferencing is the caller’s responsibility
and is unsafe in general (the underlying linear memory may
move on a memory.grow). The CUDA launch site captures the
pointer into a parameter slot and immediately hands it to
cuLaunchKernel, before any guest code can run.
Implementations§
Source§impl LoweredArg
impl LoweredArg
Sourcepub fn ptr_for_encoding(guest_offset: u32, len: u32) -> Self
pub fn ptr_for_encoding(guest_offset: u32, len: u32) -> Self
Test/encoding helper: build a LoweredArg::Ptr carrying a null
host pointer.
Out-of-crate callers (integration tests and embedders that want
to round-trip argv through encode_argv) cannot construct
LoweredArg::Ptr via struct-literal syntax because the variant
is #[non_exhaustive]; this constructor is the supported entry
point. encode_argv reads only guest_offset and len, so a
null placeholder is sufficient for the wire-format encoding
path; the launch path itself populates host_ptr via
parse_argv.
Trait Implementations§
Source§impl Clone for LoweredArg
impl Clone for LoweredArg
Source§fn clone(&self) -> LoweredArg
fn clone(&self) -> LoweredArg
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for LoweredArg
impl Debug for LoweredArg
Source§impl From<&LoweredArg> for LoweredArgSnapshot
impl From<&LoweredArg> for LoweredArgSnapshot
Source§fn from(arg: &LoweredArg) -> Self
fn from(arg: &LoweredArg) -> Self
Source§impl PartialEq for LoweredArg
impl PartialEq for LoweredArg
Source§fn eq(&self, other: &LoweredArg) -> bool
fn eq(&self, other: &LoweredArg) -> bool
self and other values to be equal, and is used by ==.impl Send for LoweredArg
impl StructuralPartialEq for LoweredArg
Auto Trait Implementations§
impl !Sync for LoweredArg
impl Freeze for LoweredArg
impl RefUnwindSafe for LoweredArg
impl Unpin for LoweredArg
impl UnsafeUnpin for LoweredArg
impl UnwindSafe for LoweredArg
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more