Skip to content

Commit 9a538e0

Browse files
committed
link.Dwarf: minimal changes to remove CountingWriter
1 parent 281f657 commit 9a538e0

File tree

2 files changed

+37
-28
lines changed

2 files changed

+37
-28
lines changed

lib/std/Io/Writer.zig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
gpa: std.mem.Allocator,
1+
gpa: Allocator,
22
bin_file: *link.File,
33
format: DW.Format,
44
endian: std.builtin.Endian,
@@ -21,6 +21,7 @@ debug_rnglists: DebugRngLists,
2121
debug_str: StringSection,
2222

2323
pub 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,15 +519,15 @@ 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);
525526
unit.cross_section_relocs.deinit(gpa);
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

60236025
fn 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

60306032
fn 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;
60576059
const std = @import("std");
60586060
const target_info = @import("../target.zig");
60596061
const uleb128 = std.leb.writeUleb128;
6062+
const Allocator = std.mem.Allocator;
6063+
const Writer = std.Io.Writer;

0 commit comments

Comments
 (0)