authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-07 22:21:37-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-07 22:26:42-07:00
log9a538e0d54186451772c6b07b348418089797f83
tree948bcf85b2ce5c92e481171721fba6a446b9ba1a
parent281f657377c46180e0c7044e6ac0c7b8b69ef892

link.Dwarf: minimal changes to remove CountingWriter


2 files changed, 37 insertions(+), 28 deletions(-)

lib/std/Io/Writer.zig+5
......@@ -2239,6 +2239,11 @@ pub const Discarding = struct {
22392239 };
22402240 }
22412241
2242 /// Includes buffered data (no need to flush).
2243 pub fn fullCount(d: *const Discarding) u64 {
2244 return d.count + d.writer.end;
2245 }
2246
22422247 pub fn drain(w: *Writer, data: []const []const u8, splat: usize) Error!usize {
22432248 const d: *Discarding = @alignCast(@fieldParentPtr("writer", w));
22442249 const slice = data[0 .. data.len - 1];
src/link/Dwarf.zig+32-28
......@@ -1,4 +1,4 @@
1gpa: std.mem.Allocator,
1gpa: Allocator,
22bin_file: *link.File,
33format: DW.Format,
44endian: std.builtin.Endian,
......@@ -21,6 +21,7 @@ debug_rnglists: DebugRngLists,
2121debug_str: StringSection,
2222
2323pub const UpdateError = error{
24 WriteFailed,
2425 ReinterpretDeclRef,
2526 Unimplemented,
2627 EndOfStream,
......@@ -50,7 +51,7 @@ const ModInfo = struct {
5051 dirs: std.AutoArrayHashMapUnmanaged(Unit.Index, void),
5152 files: std.AutoArrayHashMapUnmanaged(Zcu.File.Index, void),
5253
53 fn deinit(mod_info: *ModInfo, gpa: std.mem.Allocator) void {
54 fn deinit(mod_info: *ModInfo, gpa: Allocator) void {
5455 mod_info.dirs.deinit(gpa);
5556 mod_info.files.deinit(gpa);
5657 mod_info.* = undefined;
......@@ -220,7 +221,7 @@ const StringSection = struct {
220221 .section = Section.init,
221222 };
222223
223 fn deinit(str_sec: *StringSection, gpa: std.mem.Allocator) void {
224 fn deinit(str_sec: *StringSection, gpa: Allocator) void {
224225 str_sec.contents.deinit(gpa);
225226 str_sec.map.deinit(gpa);
226227 str_sec.section.deinit(gpa);
......@@ -297,7 +298,7 @@ pub const Section = struct {
297298 .len = 0,
298299 };
299300
300 fn deinit(sec: *Section, gpa: std.mem.Allocator) void {
301 fn deinit(sec: *Section, gpa: Allocator) void {
301302 for (sec.units.items) |*unit| unit.deinit(gpa);
302303 sec.units.deinit(gpa);
303304 sec.* = undefined;
......@@ -357,7 +358,7 @@ pub const Section = struct {
357358 if (sec.last == unit.toOptional()) sec.last = unit_ptr.prev;
358359 }
359360
360 fn popUnit(sec: *Section, gpa: std.mem.Allocator) void {
361 fn popUnit(sec: *Section, gpa: Allocator) void {
361362 const unit_index: Unit.Index = @enumFromInt(sec.units.items.len - 1);
362363 sec.unlinkUnit(unit_index);
363364 var unit = sec.units.pop().?;
......@@ -518,7 +519,7 @@ const Unit = struct {
518519 unit.cross_section_relocs.clearRetainingCapacity();
519520 }
520521
521 fn deinit(unit: *Unit, gpa: std.mem.Allocator) void {
522 fn deinit(unit: *Unit, gpa: Allocator) void {
522523 for (unit.entries.items) |*entry| entry.deinit(gpa);
523524 unit.entries.deinit(gpa);
524525 unit.cross_unit_relocs.deinit(gpa);
......@@ -526,7 +527,7 @@ const Unit = struct {
526527 unit.* = undefined;
527528 }
528529
529 fn addEntry(unit: *Unit, gpa: std.mem.Allocator) std.mem.Allocator.Error!Entry.Index {
530 fn addEntry(unit: *Unit, gpa: Allocator) Allocator.Error!Entry.Index {
530531 if (unit.free.unwrap()) |entry| {
531532 const entry_ptr = unit.getEntry(entry);
532533 unit.free = entry_ptr.next;
......@@ -780,7 +781,7 @@ const Entry = struct {
780781 entry.external_relocs.clearRetainingCapacity();
781782 }
782783
783 fn deinit(entry: *Entry, gpa: std.mem.Allocator) void {
784 fn deinit(entry: *Entry, gpa: Allocator) void {
784785 entry.cross_entry_relocs.deinit(gpa);
785786 entry.cross_unit_relocs.deinit(gpa);
786787 entry.cross_section_relocs.deinit(gpa);
......@@ -1133,7 +1134,7 @@ pub const Loc = union(enum) {
11331134 };
11341135 }
11351136
1136 fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) @TypeOf(writer).Error!void {
1137 fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) !void {
11371138 if (std.math.cast(u5, reg)) |small_reg| {
11381139 try writer.writeByte(op0 + small_reg);
11391140 } else {
......@@ -1142,7 +1143,7 @@ pub const Loc = union(enum) {
11421143 }
11431144 }
11441145
1145 fn write(loc: Loc, adapter: anytype) UpdateError!void {
1146 fn write(loc: Loc, adapter: anytype) !void {
11461147 const writer = adapter.writer();
11471148 switch (loc) {
11481149 .empty => {},
......@@ -1712,15 +1713,15 @@ pub const WipNav = struct {
17121713 wip_nav.func = func;
17131714 }
17141715
1715 fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1716 fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) Allocator.Error!void {
17161717 try sec.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(wip_nav.dwarf.gpa, reloc);
17171718 }
17181719
1719 pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1720 pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void {
17201721 try wip_nav.externalReloc(&wip_nav.dwarf.debug_info.section, reloc);
17211722 }
17221723
1723 fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void {
1724 fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void {
17241725 try wip_nav.externalReloc(&wip_nav.dwarf.debug_frame.section, reloc);
17251726 }
17261727
......@@ -1768,33 +1769,33 @@ pub const WipNav = struct {
17681769 }
17691770
17701771 const ExprLocCounter = struct {
1771 const Stream = std.io.CountingWriter(std.io.NullWriter);
1772 stream: Stream,
1772 stream: Writer.Discarding,
17731773 section_offset_bytes: u32,
17741774 address_size: AddressSize,
1775 fn init(dwarf: *Dwarf) ExprLocCounter {
1775 fn init(dwarf: *Dwarf, trash_buffer: []u8) ExprLocCounter {
17761776 return .{
1777 .stream = std.io.countingWriter(std.io.null_writer),
1777 .stream = .init(trash_buffer),
17781778 .section_offset_bytes = dwarf.sectionOffsetBytes(),
17791779 .address_size = dwarf.address_size,
17801780 };
17811781 }
1782 fn writer(counter: *ExprLocCounter) Stream.Writer {
1783 return counter.stream.writer();
1782 fn writer(counter: *ExprLocCounter) *Writer {
1783 return &counter.stream.writer;
17841784 }
17851785 fn endian(_: ExprLocCounter) std.builtin.Endian {
17861786 return @import("builtin").cpu.arch.endian();
17871787 }
17881788 fn addrSym(counter: *ExprLocCounter, _: u32) error{}!void {
1789 counter.stream.bytes_written += @intFromEnum(counter.address_size);
1789 counter.stream.count += @intFromEnum(counter.address_size);
17901790 }
17911791 fn infoEntry(counter: *ExprLocCounter, _: Unit.Index, _: Entry.Index) error{}!void {
1792 counter.stream.bytes_written += counter.section_offset_bytes;
1792 counter.stream.count += counter.section_offset_bytes;
17931793 }
17941794 };
17951795
17961796 fn infoExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {
1797 var counter: ExprLocCounter = .init(wip_nav.dwarf);
1797 var trash_buffer: [64]u8 = undefined;
1798 var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer);
17981799 try loc.write(&counter);
17991800
18001801 const adapter: struct {
......@@ -1812,7 +1813,7 @@ pub const WipNav = struct {
18121813 try ctx.wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);
18131814 }
18141815 } = .{ .wip_nav = wip_nav };
1815 try uleb128(adapter.writer(), counter.stream.bytes_written);
1816 try uleb128(adapter.writer(), counter.stream.fullCount());
18161817 try loc.write(adapter);
18171818 }
18181819
......@@ -1826,7 +1827,8 @@ pub const WipNav = struct {
18261827 }
18271828
18281829 fn frameExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void {
1829 var counter: ExprLocCounter = .init(wip_nav.dwarf);
1830 var trash_buffer: [64]u8 = undefined;
1831 var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer);
18301832 try loc.write(&counter);
18311833
18321834 const adapter: struct {
......@@ -1844,7 +1846,7 @@ pub const WipNav = struct {
18441846 try ctx.wip_nav.sectionOffset(.debug_frame, .debug_info, unit, entry, 0);
18451847 }
18461848 } = .{ .wip_nav = wip_nav };
1847 try uleb128(adapter.writer(), counter.stream.bytes_written);
1849 try uleb128(adapter.writer(), counter.stream.fullCount());
18481850 try loc.write(adapter);
18491851 }
18501852
......@@ -1922,7 +1924,7 @@ pub const WipNav = struct {
19221924 try wip_nav.infoSectionOffset(.debug_info, unit, entry, 0);
19231925 }
19241926
1925 fn refForward(wip_nav: *WipNav) std.mem.Allocator.Error!u32 {
1927 fn refForward(wip_nav: *WipNav) Allocator.Error!u32 {
19261928 const dwarf = wip_nav.dwarf;
19271929 const cross_entry_relocs = &dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs;
19281930 const reloc_index: u32 = @intCast(cross_entry_relocs.items.len);
......@@ -6022,14 +6024,14 @@ fn sectionOffsetBytes(dwarf: *Dwarf) u32 {
60226024
60236025fn uleb128Bytes(value: anytype) u32 {
60246026 var trash_buffer: [64]u8 = undefined;
6025 var d: std.Io.Writer.Discarding = .init(&trash_buffer);
6027 var d: Writer.Discarding = .init(&trash_buffer);
60266028 d.writer.writeUleb128(value) catch unreachable;
60276029 return @intCast(d.count + d.writer.end);
60286030}
60296031
60306032fn sleb128Bytes(value: anytype) u32 {
60316033 var trash_buffer: [64]u8 = undefined;
6032 var d: std.Io.Writer.Discarding = .init(&trash_buffer);
6034 var d: Writer.Discarding = .init(&trash_buffer);
60336035 d.writer.writeSleb128(value) catch unreachable;
60346036 return @intCast(d.count + d.writer.end);
60356037}
......@@ -6057,3 +6059,5 @@ const sleb128 = std.leb.writeIleb128;
60576059const std = @import("std");
60586060const target_info = @import("../target.zig");
60596061const uleb128 = std.leb.writeUleb128;
6062const Allocator = std.mem.Allocator;
6063const Writer = std.Io.Writer;