From 0f820d0bdf98b3f8429a9cf2f1b405c2c0a4d958 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Thu, 9 Jun 2022 17:54:32 +0300 Subject: stage2: improve debugging tools llvm: dump failed module when -femit-llvm-ir set print_air: * print fully qualified name * use Type.fmt and Value.fmtValue, fmtDebug is useless TypedValue * handle anon structs and tuples * fix bugs --- src/TypedValue.zig | 75 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 11 deletions(-) (limited to 'src/TypedValue.zig') diff --git a/src/TypedValue.zig b/src/TypedValue.zig index 4b3bc23231..3c1b28e544 100644 --- a/src/TypedValue.zig +++ b/src/TypedValue.zig @@ -144,7 +144,41 @@ pub fn print( return writer.writeAll(".{ ... }"); } const vals = val.castTag(.aggregate).?.data; - if (ty.zigTypeTag() == .Struct) { + if (ty.castTag(.anon_struct)) |anon_struct| { + const field_names = anon_struct.data.names; + const types = anon_struct.data.types; + const max_len = std.math.min(types.len, max_aggregate_items); + + var i: u32 = 0; + while (i < max_len) : (i += 1) { + if (i != 0) try writer.writeAll(", "); + try writer.print(".{s} = ", .{field_names[i]}); + try print(.{ + .ty = types[i], + .val = vals[i], + }, writer, level - 1, mod); + } + if (types.len > max_aggregate_items) { + try writer.writeAll(", ..."); + } + return writer.writeAll(" }"); + } else if (ty.isTuple()) { + const fields = ty.tupleFields(); + const max_len = std.math.min(fields.types.len, max_aggregate_items); + + var i: u32 = 0; + while (i < max_len) : (i += 1) { + if (i != 0) try writer.writeAll(", "); + try print(.{ + .ty = fields.types[i], + .val = vals[i], + }, writer, level - 1, mod); + } + if (fields.types.len > max_aggregate_items) { + try writer.writeAll(", ..."); + } + return writer.writeAll(" }"); + } else if (ty.zigTypeTag() == .Struct) { try writer.writeAll(".{ "); const struct_fields = ty.structFields(); const len = struct_fields.count(); @@ -194,7 +228,7 @@ pub fn print( try writer.writeAll(".{ "); try print(.{ - .ty = ty.unionTagType().?, + .ty = ty.cast(Type.Payload.Union).?.data.tag_ty, .val = union_val.tag, }, writer, level - 1, mod); try writer.writeAll(" = "); @@ -278,19 +312,27 @@ pub fn print( .elem_ptr => { const elem_ptr = val.castTag(.elem_ptr).?.data; try writer.writeAll("&"); - try print(.{ - .ty = elem_ptr.elem_ty, - .val = elem_ptr.array_ptr, - }, writer, level - 1, mod); + if (level == 0) { + try writer.writeAll("(ptr)"); + } else { + try print(.{ + .ty = elem_ptr.elem_ty, + .val = elem_ptr.array_ptr, + }, writer, level - 1, mod); + } return writer.print("[{}]", .{elem_ptr.index}); }, .field_ptr => { const field_ptr = val.castTag(.field_ptr).?.data; try writer.writeAll("&"); - try print(.{ - .ty = field_ptr.container_ty, - .val = field_ptr.container_ptr, - }, writer, level - 1, mod); + if (level == 0) { + try writer.writeAll("(ptr)"); + } else { + try print(.{ + .ty = field_ptr.container_ty, + .val = field_ptr.container_ptr, + }, writer, level - 1, mod); + } if (field_ptr.container_ty.zigTypeTag() == .Struct) { const field_name = field_ptr.container_ty.structFields().keys()[field_ptr.field_index]; @@ -344,6 +386,9 @@ pub fn print( return writer.writeAll(" }"); }, .slice => { + if (level == 0) { + return writer.writeAll(".{ ... }"); + } const payload = val.castTag(.slice).?.data; try writer.writeAll(".{ "); const elem_ty = ty.elemType2(); @@ -372,17 +417,25 @@ pub fn print( .@"error" => return writer.print("error.{s}", .{val.castTag(.@"error").?.data.name}), .eu_payload => { val = val.castTag(.eu_payload).?.data; + ty = ty.errorUnionPayload(); }, .opt_payload => { val = val.castTag(.opt_payload).?.data; + var buf: Type.Payload.ElemType = undefined; + ty = ty.optionalChild(&buf); + return print(.{ .ty = ty, .val = val }, writer, level, mod); }, .eu_payload_ptr => { try writer.writeAll("&"); val = val.castTag(.eu_payload_ptr).?.data.container_ptr; + ty = ty.elemType2().errorUnionPayload(); }, .opt_payload_ptr => { try writer.writeAll("&"); - val = val.castTag(.opt_payload_ptr).?.data.container_ptr; + val = val.castTag(.opt_payload).?.data; + var buf: Type.Payload.ElemType = undefined; + ty = ty.elemType2().optionalChild(&buf); + return print(.{ .ty = ty, .val = val }, writer, level, mod); }, // TODO these should not appear in this function -- cgit v1.2.3