// continue;
// }
+ if (type->kind == Type_Kind_Union) {
+ output_unsigned_integer(9, §ion_buff);
+ output_unsigned_integer(type->Union.alignment, §ion_buff);
+
+ i32 var_count = bh_arr_length(type->Union.variants_ordered);
+ output_unsigned_integer(var_count, §ion_buff);
+
+ fori (i, 0, var_count) {
+ char *name = type->Union.variants_ordered[i]->name;
+ output_name(name, strlen(name), §ion_buff);
+
+ output_unsigned_integer(type->Union.variants_ordered[i]->type->id, §ion_buff);
+ }
+
+ continue;
+ }
+
if (type->kind == Type_Kind_Function) {
output_unsigned_integer(6, §ion_buff);
output_unsigned_integer(type->Function.param_count, §ion_buff);
debug_type_kind_function = 6,
debug_type_kind_slice = 7,
debug_type_kind_enum = 8,
+ debug_type_kind_union = 9,
} debug_type_kind_t;
typedef enum debug_type_primitive_kind_t {
debug_type_enum_value_t *values;
} debug_type_enum_t;
+typedef struct debug_type_union_variant_t {
+ char *name;
+ u32 type;
+} debug_type_union_variant_t;
+
+typedef struct debug_type_union_t {
+ u32 tag_size;
+ u32 variant_count;
+ debug_type_union_variant_t *variants;
+} debug_type_union_t;
+
typedef struct debug_type_info_t {
u32 id;
char *name;
debug_type_function_t function;
debug_type_slice_t slice;
debug_type_enum_t enumeration;
+ debug_type_union_t onion;
};
} debug_type_info_t;
}
break;
+ case debug_type_kind_union:
+ type.onion.tag_size = uleb128_to_uint(data, &offset);
+ type.onion.variant_count = uleb128_to_uint(data, &offset);
+ type.onion.variants = bh_alloc_array(info->alloc, debug_type_union_variant_t, type.onion.variant_count);
+
+ fori (i, 0, type.onion.variant_count) {
+ u32 name_length = uleb128_to_uint(data, &offset);
+ type.onion.variants[i].name = bh_alloc_array(info->alloc, char, name_length + 1);
+ memcpy(type.onion.variants[i].name, data + offset, name_length);
+ type.onion.variants[i].name[name_length] = 0;
+ offset += name_length;
+
+ type.onion.variants[i].type = uleb128_to_uint(data, &offset);
+ }
+ break;
+
// Error handling
default: assert(("Unrecognized type kind", 0));
}
if (func_id > (u32) bh_arr_length(info->funcs)) return false;
*out = info->funcs[func_id];
return true;
-}
\ No newline at end of file
+}
break;
}
+ case debug_type_kind_union: {
+ u32 variant = *(u32 *) base;
+ if (variant == 0) {
+ WRITE("unknown_variant");
+
+ } else {
+ debug_type_union_variant_t *uv = &type->onion.variants[variant - 1];
+
+ WRITE_FORMAT("%s(", uv->name);
+ append_value_from_memory_with_type(builder, bh_pointer_add(base, type->onion.tag_size), uv->type);
+ WRITE(")");
+ }
+ break;
+ }
+
default: WRITE("(unknown)"); break;
}
}
print_links :: (l: &Link) {
walker := l;
while true {
- switch *walker {
+ switch walker {
case .End do break break;
case .Next => &next {