I've been trying to figure out how to most efficiently represent unions, and debating some different approaches. I'm writing off heap-allocation because stackslots can do that but better as far as I can tell. Mainly I'm wondering how unions might be represented with SSA values. Take the simple union f32 | u32
; I don't believe either of SSA registers or cranelift_frontend variables can actually represent a union of primitive types, only one specific primitive, and there's no way to change that at runtime afaik. It seems like the only reasonable method (which it appears rustc_codegen_cranelift uses) is to allocate unions on the stack and manipulate them by reference.
Is there anything else I missed, or is that about it?
In LLVM i would stack allocate a [i8 x sizeofmafield] and cast it yes.
You can also choose to specify variables with one type and use bitcast when you want to read or write it as the other type.
Last updated: Dec 23 2024 at 12:05 UTC