On Mon, Aug 19, 2024 at 10:17 PM Benno Lossin <benno.lossin@xxxxxxxxx> wrote: > > On 19.08.24 21:38, Sami Tolvanen wrote: > > > > This definitely looks cleaner than unions in Rust, but how would this > > scheme be visible in DWARF? You might also need to expand the annotation > > to allow replacing one reserved field with multiple smaller ones without > > using structs. > > Hmm that's a good question, I have no idea how DWARF works. The way you > do it in this patch is just by the name of the field, right? Correct, it just looks at the name of the union fields. > If Rust's DWARF output contains exact types names (I just checked this, > I *think* that this is the case, but I have never used/seen DWARF > before), we might be able to just create a `KAbiReserved<T, R>` type > that you search for instead of the attribute. The usage would then be > like this: > > #[repr(C)] > pub struct Struct1 { > a: u64, > _reserved: KAbiReserved<(), u64>, > } > > And then when adding a new field, you would do this: > > #[repr(C)] > pub struct Struct1 { > a: u64, > b: KAbiReserved<Struct2, u64>, > } > > /* Struct2 as above */ > > The way `KAbiReserved` is implemented is via a `union` (maybe a bit > ironic, considering what I said in my other replies, but in this case, > we would provide a safe abstraction over this `union`, thus avoiding > exposing users of this type to `unsafe`): > > #[repr(C)] > pub union KAbiReserved<T, R> { > value: T, > _reserved: R, > } I like this approach even better, assuming any remaining issues with ownership etc. can be sorted out. This would also look identical to the C version in DWARF if you rename _reserved in the union to __kabi_reserved. Of course, we can always change gendwarfksyms to support a different scheme for Rust code if a better solution comes along later. Sami