From 9a538e0d54186451772c6b07b348418089797f83 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 7 Aug 2025 22:21:37 -0700 Subject: [PATCH] link.Dwarf: minimal changes to remove CountingWriter --- lib/std/Io/Writer.zig | 5 ++++ src/link/Dwarf.zig | 60 +++++++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig index 797a69914c3b06afc1c1d331f2484802e3cd1127..dd3994c41373c460ef71508a7a0e7ceaeba5db1a 100644 --- a/lib/std/Io/Writer.zig +++ b/lib/std/Io/Writer.zig @@ -2239,6 +2239,11 @@ pub const Discarding = struct { }; } + /// Includes buffered data (no need to flush). + pub fn fullCount(d: *const Discarding) u64 { + return d.count + d.writer.end; + } + pub fn drain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { const d: *Discarding = @alignCast(@fieldParentPtr("writer", w)); const slice = data[0 .. data.len - 1]; diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index f11ebc94d4e7fd49ace3128e35e9dd4ead9c01f7..5c805e6a7ef2c3a1428cbf00946e37f99bdfc6c3 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -1,4 +1,4 @@ -gpa: std.mem.Allocator, +gpa: Allocator, bin_file: *link.File, format: DW.Format, endian: std.builtin.Endian, @@ -21,6 +21,7 @@ debug_rnglists: DebugRngLists, debug_str: StringSection, pub const UpdateError = error{ + WriteFailed, ReinterpretDeclRef, Unimplemented, EndOfStream, @@ -50,7 +51,7 @@ const ModInfo = struct { dirs: std.AutoArrayHashMapUnmanaged(Unit.Index, void), files: std.AutoArrayHashMapUnmanaged(Zcu.File.Index, void), - fn deinit(mod_info: *ModInfo, gpa: std.mem.Allocator) void { + fn deinit(mod_info: *ModInfo, gpa: Allocator) void { mod_info.dirs.deinit(gpa); mod_info.files.deinit(gpa); mod_info.* = undefined; @@ -220,7 +221,7 @@ const StringSection = struct { .section = Section.init, }; - fn deinit(str_sec: *StringSection, gpa: std.mem.Allocator) void { + fn deinit(str_sec: *StringSection, gpa: Allocator) void { str_sec.contents.deinit(gpa); str_sec.map.deinit(gpa); str_sec.section.deinit(gpa); @@ -297,7 +298,7 @@ pub const Section = struct { .len = 0, }; - fn deinit(sec: *Section, gpa: std.mem.Allocator) void { + fn deinit(sec: *Section, gpa: Allocator) void { for (sec.units.items) |*unit| unit.deinit(gpa); sec.units.deinit(gpa); sec.* = undefined; @@ -357,7 +358,7 @@ pub const Section = struct { if (sec.last == unit.toOptional()) sec.last = unit_ptr.prev; } - fn popUnit(sec: *Section, gpa: std.mem.Allocator) void { + fn popUnit(sec: *Section, gpa: Allocator) void { const unit_index: Unit.Index = @enumFromInt(sec.units.items.len - 1); sec.unlinkUnit(unit_index); var unit = sec.units.pop().?; @@ -518,7 +519,7 @@ const Unit = struct { unit.cross_section_relocs.clearRetainingCapacity(); } - fn deinit(unit: *Unit, gpa: std.mem.Allocator) void { + fn deinit(unit: *Unit, gpa: Allocator) void { for (unit.entries.items) |*entry| entry.deinit(gpa); unit.entries.deinit(gpa); unit.cross_unit_relocs.deinit(gpa); @@ -526,7 +527,7 @@ const Unit = struct { unit.* = undefined; } - fn addEntry(unit: *Unit, gpa: std.mem.Allocator) std.mem.Allocator.Error!Entry.Index { + fn addEntry(unit: *Unit, gpa: Allocator) Allocator.Error!Entry.Index { if (unit.free.unwrap()) |entry| { const entry_ptr = unit.getEntry(entry); unit.free = entry_ptr.next; @@ -780,7 +781,7 @@ const Entry = struct { entry.external_relocs.clearRetainingCapacity(); } - fn deinit(entry: *Entry, gpa: std.mem.Allocator) void { + fn deinit(entry: *Entry, gpa: Allocator) void { entry.cross_entry_relocs.deinit(gpa); entry.cross_unit_relocs.deinit(gpa); entry.cross_section_relocs.deinit(gpa); @@ -1133,7 +1134,7 @@ pub const Loc = union(enum) { }; } - fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) @TypeOf(writer).Error!void { + fn writeReg(reg: u32, op0: u8, opx: u8, writer: anytype) !void { if (std.math.cast(u5, reg)) |small_reg| { try writer.writeByte(op0 + small_reg); } else { @@ -1142,7 +1143,7 @@ pub const Loc = union(enum) { } } - fn write(loc: Loc, adapter: anytype) UpdateError!void { + fn write(loc: Loc, adapter: anytype) !void { const writer = adapter.writer(); switch (loc) { .empty => {}, @@ -1712,15 +1713,15 @@ pub const WipNav = struct { wip_nav.func = func; } - fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) std.mem.Allocator.Error!void { + fn externalReloc(wip_nav: *WipNav, sec: *Section, reloc: ExternalReloc) Allocator.Error!void { try sec.getUnit(wip_nav.unit).getEntry(wip_nav.entry).external_relocs.append(wip_nav.dwarf.gpa, reloc); } - pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void { + pub fn infoExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void { try wip_nav.externalReloc(&wip_nav.dwarf.debug_info.section, reloc); } - fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) std.mem.Allocator.Error!void { + fn frameExternalReloc(wip_nav: *WipNav, reloc: ExternalReloc) Allocator.Error!void { try wip_nav.externalReloc(&wip_nav.dwarf.debug_frame.section, reloc); } @@ -1768,33 +1769,33 @@ pub const WipNav = struct { } const ExprLocCounter = struct { - const Stream = std.io.CountingWriter(std.io.NullWriter); - stream: Stream, + stream: Writer.Discarding, section_offset_bytes: u32, address_size: AddressSize, - fn init(dwarf: *Dwarf) ExprLocCounter { + fn init(dwarf: *Dwarf, trash_buffer: []u8) ExprLocCounter { return .{ - .stream = std.io.countingWriter(std.io.null_writer), + .stream = .init(trash_buffer), .section_offset_bytes = dwarf.sectionOffsetBytes(), .address_size = dwarf.address_size, }; } - fn writer(counter: *ExprLocCounter) Stream.Writer { - return counter.stream.writer(); + fn writer(counter: *ExprLocCounter) *Writer { + return &counter.stream.writer; } fn endian(_: ExprLocCounter) std.builtin.Endian { return @import("builtin").cpu.arch.endian(); } fn addrSym(counter: *ExprLocCounter, _: u32) error{}!void { - counter.stream.bytes_written += @intFromEnum(counter.address_size); + counter.stream.count += @intFromEnum(counter.address_size); } fn infoEntry(counter: *ExprLocCounter, _: Unit.Index, _: Entry.Index) error{}!void { - counter.stream.bytes_written += counter.section_offset_bytes; + counter.stream.count += counter.section_offset_bytes; } }; fn infoExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void { - var counter: ExprLocCounter = .init(wip_nav.dwarf); + var trash_buffer: [64]u8 = undefined; + var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer); try loc.write(&counter); const adapter: struct { @@ -1812,7 +1813,7 @@ pub const WipNav = struct { try ctx.wip_nav.infoSectionOffset(.debug_info, unit, entry, 0); } } = .{ .wip_nav = wip_nav }; - try uleb128(adapter.writer(), counter.stream.bytes_written); + try uleb128(adapter.writer(), counter.stream.fullCount()); try loc.write(adapter); } @@ -1826,7 +1827,8 @@ pub const WipNav = struct { } fn frameExprLoc(wip_nav: *WipNav, loc: Loc) UpdateError!void { - var counter: ExprLocCounter = .init(wip_nav.dwarf); + var trash_buffer: [64]u8 = undefined; + var counter: ExprLocCounter = .init(wip_nav.dwarf, &trash_buffer); try loc.write(&counter); const adapter: struct { @@ -1844,7 +1846,7 @@ pub const WipNav = struct { try ctx.wip_nav.sectionOffset(.debug_frame, .debug_info, unit, entry, 0); } } = .{ .wip_nav = wip_nav }; - try uleb128(adapter.writer(), counter.stream.bytes_written); + try uleb128(adapter.writer(), counter.stream.fullCount()); try loc.write(adapter); } @@ -1922,7 +1924,7 @@ pub const WipNav = struct { try wip_nav.infoSectionOffset(.debug_info, unit, entry, 0); } - fn refForward(wip_nav: *WipNav) std.mem.Allocator.Error!u32 { + fn refForward(wip_nav: *WipNav) Allocator.Error!u32 { const dwarf = wip_nav.dwarf; const cross_entry_relocs = &dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(wip_nav.entry).cross_entry_relocs; const reloc_index: u32 = @intCast(cross_entry_relocs.items.len); @@ -6022,14 +6024,14 @@ fn sectionOffsetBytes(dwarf: *Dwarf) u32 { fn uleb128Bytes(value: anytype) u32 { var trash_buffer: [64]u8 = undefined; - var d: std.Io.Writer.Discarding = .init(&trash_buffer); + var d: Writer.Discarding = .init(&trash_buffer); d.writer.writeUleb128(value) catch unreachable; return @intCast(d.count + d.writer.end); } fn sleb128Bytes(value: anytype) u32 { var trash_buffer: [64]u8 = undefined; - var d: std.Io.Writer.Discarding = .init(&trash_buffer); + var d: Writer.Discarding = .init(&trash_buffer); d.writer.writeSleb128(value) catch unreachable; return @intCast(d.count + d.writer.end); } @@ -6057,3 +6059,5 @@ const sleb128 = std.leb.writeIleb128; const std = @import("std"); const target_info = @import("../target.zig"); const uleb128 = std.leb.writeUleb128; +const Allocator = std.mem.Allocator; +const Writer = std.Io.Writer; -- 2.54.0