]> git.proxmox.com Git - wasi-libc.git/commitdiff
wasi-headers: unions are tagged now
authorPat Hickey <pat@moreproductive.org>
Thu, 6 Feb 2020 21:19:44 +0000 (13:19 -0800)
committerPat Hickey <pat@moreproductive.org>
Mon, 24 Feb 2020 19:36:05 +0000 (11:36 -0800)
tools/wasi-headers/src/c_header.rs

index 5e0fb974f7b3666933fe4b0bc181190f7fe4cff3..fee5486b0d108db24affd23fbdf6d819144288d8 100644 (file)
@@ -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");
 }