[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 07/25] tools/xenbindgen: Add support for structs in TOML specs
Hi Alejandro, Le 15/11/2024 à 12:51, Alejandro Vallejo a écrit : > Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> > --- > tools/rust/xenbindgen/src/c_lang.rs | 56 ++++++++++++++++++++++++- > tools/rust/xenbindgen/src/spec.rs | 64 ++++++++++++++++++++++++++++- > 2 files changed, 117 insertions(+), 3 deletions(-) > > diff --git a/tools/rust/xenbindgen/src/c_lang.rs > b/tools/rust/xenbindgen/src/c_lang.rs > index f05e36bb362f..597e0ed41362 100644 > --- a/tools/rust/xenbindgen/src/c_lang.rs > +++ b/tools/rust/xenbindgen/src/c_lang.rs > @@ -17,9 +17,10 @@ > > use std::fmt::Write; > > -use crate::spec::OutFileDef; > +use crate::spec::{OutFileDef, StructDef, Typ}; > > use convert_case::{Case, Casing}; > +use log::{debug, trace}; > > /// An abstract indentation level. 0 is no indentation, 1 is > [`INDENT_WIDTH`] > /// and so on. > @@ -29,6 +30,39 @@ struct Indentation(usize); > /// Default width of each level of indentation > const INDENT_WIDTH: usize = 4; > > +/// Create a C-compatible struct field. Without the terminating semicolon. > +fn structfield(typ: &Typ, name: &str) -> String { > + match typ { > + Typ::Ptr(x) => { > + let t: &Typ = x; > + format!( > + "XEN_GUEST_HANDLE_64({}) {name}", > + match t { > + Typ::U8 => "uint8", > + Typ::U16 => "uint16", > + Typ::U32 => "uint32", > + Typ::U64 => "uint64_aligned_t", > + Typ::I8 => "int8", > + Typ::I16 => "int16", > + Typ::I32 => "int32", > + Typ::I64 => "int64_aligned_t", > + _ => panic!("foo {t:?}"), > + } > + ) > + } > + Typ::Struct(x) => format!("struct {x} {name}"), > + Typ::Array(x, len) => format!("{}{name}[{len}]", structfield(x, "")), > + Typ::U8 => format!("uint8_t {name}"), > + Typ::U16 => format!("uint16_t {name}"), > + Typ::U32 => format!("uint32_t {name}"), > + Typ::U64 => format!("uint64_aligned_t {name}"), > + Typ::I8 => format!("int8_t {name}"), > + Typ::I16 => format!("int16_t {name}"), > + Typ::I32 => format!("int32_t {name}"), > + Typ::I64 => format!("int64_aligned_t {name}"), > + } > +} > + I think _t are missing in the Ptr cases (we are currently generating XEN_GUEST_HANDLE_64(uint8) which I don't think is valid). Aside that, wouldn't it be better to have a separate function for converting the type to its C representation ? Something like impl Typ { // or blanket trait fn c_repr(&self) -> String { match self { /* ... */ } } } fn structfield(typ: &Typ, name: &str) -> String { format!("{} {name}", typ.c_repr()); } We can also consider Typ::Struct or Typ::Array cases to call recursively to c_repr on its inner type to get its representation. That way, we can have XEN_GUEST_HANDLE_64(struct something). Cheers Teddy Teddy Astie | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |