diff options
| author | Luuk de Gram <luuk@degram.dev> | 2021-07-18 16:53:21 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-07-20 12:19:16 -0700 |
| commit | 480242b78a5018bbe28824eb3549bfa86126a6e8 (patch) | |
| tree | 7dc02c646ae10af6e5586b9ab24ddc5a394b3a0f /src | |
| parent | 44fe9c52e15deb1a1ea82760c5f4204d50fb0e9f (diff) | |
| download | zig-480242b78a5018bbe28824eb3549bfa86126a6e8.tar.gz zig-480242b78a5018bbe28824eb3549bfa86126a6e8.zip | |
Debug info - Implement more instructions:
- bin_op
- un_op
- block
- struct_field_ptr
- br
- condbr
Also updates constant to write the actual Type, rather than the enum tag of the `Ref`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/print_air.zig | 74 |
1 files changed, 51 insertions, 23 deletions
diff --git a/src/print_air.zig b/src/print_air.zig index 76159d0796..6fa04fbfab 100644 --- a/src/print_air.zig +++ b/src/print_air.zig @@ -182,21 +182,22 @@ const Writer = struct { } fn writeBinOp(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const bin_op = w.air.instructions.items(.data)[inst].bin_op; + try w.writeInstRef(s, bin_op.lhs); + try s.writeAll(", "); + try w.writeInstRef(s, bin_op.rhs); } fn writeUnOp(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const un_op = w.air.instructions.items(.data)[inst].un_op; + try w.writeInstRef(s, un_op); } fn writeNoOp(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { _ = w; _ = inst; - try s.writeAll("TODO"); + _ = s; + // no-op, no argument to write } fn writeTy(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { @@ -205,21 +206,31 @@ const Writer = struct { } fn writeTyOp(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const ty_op = w.air.instructions.items(.data)[inst].ty_op; + try s.print("{}, ", .{w.air.getRefType(ty_op.ty)}); + try w.writeInstRef(s, ty_op.operand); } fn writeBlock(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; + const extra = w.air.extraData(Air.Block, ty_pl.payload); + const body = w.air.extra[extra.end..][0..extra.data.body_len]; + + try s.writeAll("{\n"); + const old_indent = w.indent; + w.indent += 2; + try w.writeBody(s, body); + w.indent = old_indent; + try s.writeByteNTimes(' ', w.indent); + try s.writeAll("}"); } fn writeStructFieldPtr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; + const extra = w.air.extraData(Air.StructField, ty_pl.payload); + + try w.writeInstRef(s, extra.data.struct_ptr); + try s.print(", {d}", .{extra.data.field_index}); } fn writeVarPtr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { @@ -231,7 +242,7 @@ const Writer = struct { fn writeConstant(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; const val = w.air.values[ty_pl.payload]; - try s.print("{}, {}", .{ ty_pl.ty, val }); + try s.print("{}, {}", .{ w.air.getRefType(ty_pl.ty), val }); } fn writeAssembly(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { @@ -259,15 +270,32 @@ const Writer = struct { } fn writeBr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const br = w.air.instructions.items(.data)[inst].br; + try w.writeInstIndex(s, br.block_inst); + try s.writeAll(", "); + try w.writeInstRef(s, br.operand); } fn writeCondBr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { - _ = w; - _ = inst; - try s.writeAll("TODO"); + const pl_op = w.air.instructions.items(.data)[inst].pl_op; + const extra = w.air.extraData(Air.CondBr, pl_op.payload); + const then_body = w.air.extra[extra.end..][0..extra.data.then_body_len]; + const else_body = w.air.extra[extra.end + then_body.len ..][0..extra.data.else_body_len]; + + try w.writeInstRef(s, pl_op.operand); + try s.writeAll(", {\n"); + const old_indent = w.indent; + w.indent += 2; + + try w.writeBody(s, then_body); + try s.writeByteNTimes(' ', old_indent); + try s.writeAll("}, {\n"); + + try w.writeBody(s, else_body); + w.indent = old_indent; + + try s.writeByteNTimes(' ', old_indent); + try s.writeAll("}"); } fn writeSwitchBr(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { |
