From 71d279a4b0380c6527e6f9be6e7110cf6bc62df1 Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Thu, 6 Feb 2020 13:19:44 -0800 Subject: [PATCH] wasi-headers: unions are tagged now --- tools/wasi-headers/src/c_header.rs | 54 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/tools/wasi-headers/src/c_header.rs b/tools/wasi-headers/src/c_header.rs index 5e0fb97..fee5486 100644 --- a/tools/wasi-headers/src/c_header.rs +++ b/tools/wasi-headers/src/c_header.rs @@ -308,23 +308,36 @@ fn print_struct(ret: &mut String, name: &Id, s: &StructDatatype) { } 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 { - if !variant.docs.is_empty() { - ret.push_str(" /**\n"); - for line in variant.docs.lines() { - ret.push_str(&format!(" * {}\n", line)); + if let Some(ref tref) = variant.tref { + if !variant.docs.is_empty() { + ret.push_str(" /**\n"); + for line in variant.docs.lines() { + ret.push_str(&format!(" * {}\n", line)); + } + ret.push_str(" */\n"); } - ret.push_str(" */\n"); + ret.push_str(&format!( + " {} {};\n", + typeref_name(tref), + ident_name(&variant.name) + )); } - ret.push_str(&format!( - " {} {};\n", - typeref_name(&variant.tref), - 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("\n"); @@ -340,6 +353,23 @@ fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) { 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"); }