wasi-headers: unions are tagged now

This commit is contained in:
Pat Hickey 2020-02-06 13:19:44 -08:00
parent 3af77075aa
commit 71d279a4b0

View File

@ -308,9 +308,13 @@ fn print_struct(ret: &mut String, name: &Id, s: &StructDatatype) {
} }
fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) { fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) {
ret.push_str(&format!("typedef union __wasi_{}_t {{\n", ident_name(name))); ret.push_str(&format!(
"typedef union __wasi_{}_u_t {{\n",
ident_name(name)
));
for variant in &u.variants { for variant in &u.variants {
if let Some(ref tref) = variant.tref {
if !variant.docs.is_empty() { if !variant.docs.is_empty() {
ret.push_str(" /**\n"); ret.push_str(" /**\n");
for line in variant.docs.lines() { for line in variant.docs.lines() {
@ -320,11 +324,20 @@ fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) {
} }
ret.push_str(&format!( ret.push_str(&format!(
" {} {};\n", " {} {};\n",
typeref_name(&variant.tref), typeref_name(tref),
ident_name(&variant.name) ident_name(&variant.name)
)); ));
ret.push_str("\n");
} }
}
ret.push_str(&format!("}} __wasi_{}_u_t;\n", ident_name(name)));
ret.push_str(&format!(
"typedef struct __wasi_{}_t {{\n",
ident_name(name)
));
ret.push_str(&format!(" {} tag;\n", typeref_name(&u.tag)));
ret.push_str(&format!(" __wasi_{}_u_t u;\n", ident_name(name)));
ret.push_str(&format!("}} __wasi_{}_t;\n", ident_name(name))); ret.push_str(&format!("}} __wasi_{}_t;\n", ident_name(name)));
ret.push_str("\n"); ret.push_str("\n");
@ -340,6 +353,23 @@ fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) {
u.mem_align() u.mem_align()
)); ));
let l = u.union_layout();
ret.push_str(&format!(
"_Static_assert(offsetof(__wasi_{}_t, u) == {}, \"witx calculated union offset\");\n",
ident_name(name),
l.contents_offset,
));
ret.push_str(&format!(
"_Static_assert(sizeof(__wasi_{}_u_t) == {}, \"witx calculated union size\");\n",
ident_name(name),
l.contents_size,
));
ret.push_str(&format!(
"_Static_assert(_Alignof(__wasi_{}_u_t) == {}, \"witx calculated union align\");\n",
ident_name(name),
l.contents_align,
));
ret.push_str("\n"); ret.push_str("\n");
} }