| author | |
| committer | |
| log | 8ba937c787efd690a8a984f9ab42cac00fb9b2bf |
| tree | 4a84c3da1cac4640565ae1985f8f07fb1431876e |
| parent | 40e1fca34b2c0d2cde130fd17331a2935c473644 |
| parent | 13503b7cba2c826633017e34e8bda2bf5072e7f6 |
| signature |
Misc cleanups3 files changed, 65 insertions(+), 19 deletions(-)
src/arch/x86_64/CodeGen.zig+1-3| ... | ... | @@ -439,9 +439,7 @@ fn dumpWipMir(self: *Self, inst: Mir.Inst) !void { |
| 439 | 439 | }, |
| 440 | 440 | else => |e| return e, |
| 441 | 441 | }) |lower_inst| { |
| 442 | try stderr.writeAll(" | "); | |
| 443 | try lower_inst.fmtPrint(stderr); | |
| 444 | try stderr.writeByte('\n'); | |
| 442 | try stderr.print(" | {}\n", .{lower_inst}); | |
| 445 | 443 | } |
| 446 | 444 | } |
| 447 | 445 |
src/arch/x86_64/encoder.zig+44-3| ... | ... | @@ -54,7 +54,34 @@ pub const Instruction = struct { |
| 54 | 54 | }; |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | pub fn fmtPrint(op: Operand, enc_op: Encoding.Op, writer: anytype) @TypeOf(writer).Error!void { | |
| 57 | fn format( | |
| 58 | op: Operand, | |
| 59 | comptime unused_format_string: []const u8, | |
| 60 | options: std.fmt.FormatOptions, | |
| 61 | writer: anytype, | |
| 62 | ) !void { | |
| 63 | _ = op; | |
| 64 | _ = unused_format_string; | |
| 65 | _ = options; | |
| 66 | _ = writer; | |
| 67 | @compileError("do not format Operand directly; use fmtPrint() instead"); | |
| 68 | } | |
| 69 | ||
| 70 | const FormatContext = struct { | |
| 71 | op: Operand, | |
| 72 | enc_op: Encoding.Op, | |
| 73 | }; | |
| 74 | ||
| 75 | fn fmt( | |
| 76 | ctx: FormatContext, | |
| 77 | comptime unused_format_string: []const u8, | |
| 78 | options: std.fmt.FormatOptions, | |
| 79 | writer: anytype, | |
| 80 | ) @TypeOf(writer).Error!void { | |
| 81 | _ = unused_format_string; | |
| 82 | _ = options; | |
| 83 | const op = ctx.op; | |
| 84 | const enc_op = ctx.enc_op; | |
| 58 | 85 | switch (op) { |
| 59 | 86 | .none => {}, |
| 60 | 87 | .reg => |reg| try writer.writeAll(@tagName(reg)), |
| ... | ... | @@ -105,6 +132,13 @@ pub const Instruction = struct { |
| 105 | 132 | .imm => |imm| try writer.print("0x{x}", .{imm.asUnsigned(enc_op.bitSize())}), |
| 106 | 133 | } |
| 107 | 134 | } |
| 135 | ||
| 136 | pub fn fmtPrint(op: Operand, enc_op: Encoding.Op) std.fmt.Formatter(fmt) { | |
| 137 | return .{ .data = .{ | |
| 138 | .op = op, | |
| 139 | .enc_op = enc_op, | |
| 140 | } }; | |
| 141 | } | |
| 108 | 142 | }; |
| 109 | 143 | |
| 110 | 144 | pub fn new(prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) !Instruction { |
| ... | ... | @@ -130,14 +164,21 @@ pub const Instruction = struct { |
| 130 | 164 | return inst; |
| 131 | 165 | } |
| 132 | 166 | |
| 133 | pub fn fmtPrint(inst: Instruction, writer: anytype) @TypeOf(writer).Error!void { | |
| 167 | pub fn format( | |
| 168 | inst: Instruction, | |
| 169 | comptime unused_format_string: []const u8, | |
| 170 | options: std.fmt.FormatOptions, | |
| 171 | writer: anytype, | |
| 172 | ) @TypeOf(writer).Error!void { | |
| 173 | _ = unused_format_string; | |
| 174 | _ = options; | |
| 134 | 175 | if (inst.prefix != .none) try writer.print("{s} ", .{@tagName(inst.prefix)}); |
| 135 | 176 | try writer.print("{s}", .{@tagName(inst.encoding.mnemonic)}); |
| 136 | 177 | for (inst.ops, inst.encoding.data.ops, 0..) |op, enc, i| { |
| 137 | 178 | if (op == .none) break; |
| 138 | 179 | if (i > 0) try writer.writeByte(','); |
| 139 | 180 | try writer.writeByte(' '); |
| 140 | try op.fmtPrint(enc, writer); | |
| 181 | try writer.print("{}", .{op.fmtPrint(enc)}); | |
| 141 | 182 | } |
| 142 | 183 | } |
| 143 | 184 |
src/link/tapi/parse.zig+20-13| ... | ... | @@ -40,10 +40,26 @@ pub const Node = struct { |
| 40 | 40 | |
| 41 | 41 | pub fn deinit(self: *Node, allocator: Allocator) void { |
| 42 | 42 | switch (self.tag) { |
| 43 | .doc => @fieldParentPtr(Node.Doc, "base", self).deinit(allocator), | |
| 44 | .map => @fieldParentPtr(Node.Map, "base", self).deinit(allocator), | |
| 45 | .list => @fieldParentPtr(Node.List, "base", self).deinit(allocator), | |
| 46 | .value => @fieldParentPtr(Node.Value, "base", self).deinit(allocator), | |
| 43 | .doc => { | |
| 44 | const parent = @fieldParentPtr(Node.Doc, "base", self); | |
| 45 | parent.deinit(allocator); | |
| 46 | allocator.destroy(parent); | |
| 47 | }, | |
| 48 | .map => { | |
| 49 | const parent = @fieldParentPtr(Node.Map, "base", self); | |
| 50 | parent.deinit(allocator); | |
| 51 | allocator.destroy(parent); | |
| 52 | }, | |
| 53 | .list => { | |
| 54 | const parent = @fieldParentPtr(Node.List, "base", self); | |
| 55 | parent.deinit(allocator); | |
| 56 | allocator.destroy(parent); | |
| 57 | }, | |
| 58 | .value => { | |
| 59 | const parent = @fieldParentPtr(Node.Value, "base", self); | |
| 60 | parent.deinit(allocator); | |
| 61 | allocator.destroy(parent); | |
| 62 | }, | |
| 47 | 63 | } |
| 48 | 64 | } |
| 49 | 65 | |
| ... | ... | @@ -76,7 +92,6 @@ pub const Node = struct { |
| 76 | 92 | pub fn deinit(self: *Doc, allocator: Allocator) void { |
| 77 | 93 | if (self.value) |node| { |
| 78 | 94 | node.deinit(allocator); |
| 79 | allocator.destroy(node); | |
| 80 | 95 | } |
| 81 | 96 | } |
| 82 | 97 | |
| ... | ... | @@ -122,7 +137,6 @@ pub const Node = struct { |
| 122 | 137 | for (self.values.items) |entry| { |
| 123 | 138 | if (entry.value) |value| { |
| 124 | 139 | value.deinit(allocator); |
| 125 | allocator.destroy(value); | |
| 126 | 140 | } |
| 127 | 141 | } |
| 128 | 142 | self.values.deinit(allocator); |
| ... | ... | @@ -163,7 +177,6 @@ pub const Node = struct { |
| 163 | 177 | pub fn deinit(self: *List, allocator: Allocator) void { |
| 164 | 178 | for (self.values.items) |node| { |
| 165 | 179 | node.deinit(allocator); |
| 166 | allocator.destroy(node); | |
| 167 | 180 | } |
| 168 | 181 | self.values.deinit(allocator); |
| 169 | 182 | } |
| ... | ... | @@ -239,7 +252,6 @@ pub const Tree = struct { |
| 239 | 252 | self.line_cols.deinit(); |
| 240 | 253 | for (self.docs.items) |doc| { |
| 241 | 254 | doc.deinit(self.allocator); |
| 242 | self.allocator.destroy(doc); | |
| 243 | 255 | } |
| 244 | 256 | self.docs.deinit(self.allocator); |
| 245 | 257 | } |
| ... | ... | @@ -386,7 +398,6 @@ const Parser = struct { |
| 386 | 398 | } |
| 387 | 399 | errdefer if (node.value) |val| { |
| 388 | 400 | val.deinit(self.allocator); |
| 389 | self.allocator.destroy(val); | |
| 390 | 401 | }; |
| 391 | 402 | |
| 392 | 403 | // Parse footer |
| ... | ... | @@ -426,7 +437,6 @@ const Parser = struct { |
| 426 | 437 | for (node.values.items) |entry| { |
| 427 | 438 | if (entry.value) |val| { |
| 428 | 439 | val.deinit(self.allocator); |
| 429 | self.allocator.destroy(val); | |
| 430 | 440 | } |
| 431 | 441 | } |
| 432 | 442 | node.values.deinit(self.allocator); |
| ... | ... | @@ -467,7 +477,6 @@ const Parser = struct { |
| 467 | 477 | const val = try self.value(); |
| 468 | 478 | errdefer if (val) |v| { |
| 469 | 479 | v.deinit(self.allocator); |
| 470 | self.allocator.destroy(v); | |
| 471 | 480 | }; |
| 472 | 481 | |
| 473 | 482 | if (val) |v| { |
| ... | ... | @@ -503,7 +512,6 @@ const Parser = struct { |
| 503 | 512 | errdefer { |
| 504 | 513 | for (node.values.items) |val| { |
| 505 | 514 | val.deinit(self.allocator); |
| 506 | self.allocator.destroy(val); | |
| 507 | 515 | } |
| 508 | 516 | node.values.deinit(self.allocator); |
| 509 | 517 | } |
| ... | ... | @@ -535,7 +543,6 @@ const Parser = struct { |
| 535 | 543 | errdefer { |
| 536 | 544 | for (node.values.items) |val| { |
| 537 | 545 | val.deinit(self.allocator); |
| 538 | self.allocator.destroy(val); | |
| 539 | 546 | } |
| 540 | 547 | node.values.deinit(self.allocator); |
| 541 | 548 | } |