aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-08-27 19:51:12 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-08-29 11:11:59 -0700
commit558bea2a76179fcc00779fdd326e5a866956fc9b (patch)
tree6070f8eb4c330ed37ef566a1e3085bbb0326e10f /src
parent4b948e8556b80cbc874415aa7c4bf9ac0027ffed (diff)
downloadzig-558bea2a76179fcc00779fdd326e5a866956fc9b.tar.gz
zig-558bea2a76179fcc00779fdd326e5a866956fc9b.zip
std.Io: delete CountingReader
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/Disassembler.zig42
-rw-r--r--src/link/MachO/Dwarf.zig30
-rw-r--r--src/link/MachO/Dylib.zig40
-rw-r--r--src/link/MachO/eh_frame.zig33
4 files changed, 61 insertions, 84 deletions
diff --git a/src/arch/x86_64/Disassembler.zig b/src/arch/x86_64/Disassembler.zig
index 545f6c0e96..1625cd84e8 100644
--- a/src/arch/x86_64/Disassembler.zig
+++ b/src/arch/x86_64/Disassembler.zig
@@ -17,12 +17,16 @@ const Rex = encoder.Rex;
pub const Error = error{
EndOfStream,
+ /// After the TODO below is solved this will make sense.
+ ReadFailed,
LegacyPrefixAfterRex,
UnknownOpcode,
Overflow,
Todo,
};
+// TODO these fields should be replaced by std.Io.Reader
+
code: []const u8,
pos: usize = 0,
@@ -388,20 +392,20 @@ fn parseGpRegister(low_enc: u3, is_extended: bool, rex: Rex, bit_size: u64) Regi
}
fn parseImm(dis: *Disassembler, kind: Encoding.Op) !Immediate {
- var stream = std.io.fixedBufferStream(dis.code[dis.pos..]);
- var creader = std.io.countingReader(stream.reader());
- const reader = creader.reader();
+ var reader: std.Io.Reader = .fixed(dis.code);
+ reader.seek = dis.pos;
+ defer dis.pos = reader.seek;
+
const imm = switch (kind) {
- .imm8s, .rel8 => Immediate.s(try reader.readInt(i8, .little)),
- .imm16s, .rel16 => Immediate.s(try reader.readInt(i16, .little)),
- .imm32s, .rel32 => Immediate.s(try reader.readInt(i32, .little)),
- .imm8 => Immediate.u(try reader.readInt(u8, .little)),
- .imm16 => Immediate.u(try reader.readInt(u16, .little)),
- .imm32 => Immediate.u(try reader.readInt(u32, .little)),
- .imm64 => Immediate.u(try reader.readInt(u64, .little)),
+ .imm8s, .rel8 => Immediate.s(try reader.takeInt(i8, .little)),
+ .imm16s, .rel16 => Immediate.s(try reader.takeInt(i16, .little)),
+ .imm32s, .rel32 => Immediate.s(try reader.takeInt(i32, .little)),
+ .imm8 => Immediate.u(try reader.takeInt(u8, .little)),
+ .imm16 => Immediate.u(try reader.takeInt(u16, .little)),
+ .imm32 => Immediate.u(try reader.takeInt(u32, .little)),
+ .imm64 => Immediate.u(try reader.takeInt(u64, .little)),
else => unreachable,
};
- dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
return imm;
}
@@ -483,25 +487,25 @@ fn parseSibByte(dis: *Disassembler) !Sib {
}
fn parseDisplacement(dis: *Disassembler, modrm: ModRm, sib: ?Sib) !i32 {
- var stream = std.io.fixedBufferStream(dis.code[dis.pos..]);
- var creader = std.io.countingReader(stream.reader());
- const reader = creader.reader();
+ var reader: std.Io.Reader = .fixed(dis.code);
+ reader.seek = dis.pos;
+ defer dis.pos = reader.seek;
+
const disp = disp: {
if (sib) |info| {
if (info.base == 0b101 and modrm.mod == 0) {
- break :disp try reader.readInt(i32, .little);
+ break :disp try reader.takeInt(i32, .little);
}
}
if (modrm.rip()) {
- break :disp try reader.readInt(i32, .little);
+ break :disp try reader.takeInt(i32, .little);
}
break :disp switch (modrm.mod) {
0b00 => 0,
- 0b01 => try reader.readInt(i8, .little),
- 0b10 => try reader.readInt(i32, .little),
+ 0b01 => try reader.takeInt(i8, .little),
+ 0b10 => try reader.takeInt(i32, .little),
0b11 => unreachable,
};
};
- dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
return disp;
}
diff --git a/src/link/MachO/Dwarf.zig b/src/link/MachO/Dwarf.zig
index fdc3f33bbc..85757ead7b 100644
--- a/src/link/MachO/Dwarf.zig
+++ b/src/link/MachO/Dwarf.zig
@@ -273,19 +273,19 @@ pub const InfoReader = struct {
}
pub fn readUleb128(p: *InfoReader, comptime Type: type) !Type {
- var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
- var creader = std.io.countingReader(stream.reader());
- const value: Type = try leb.readUleb128(Type, creader.reader());
- p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
- return value;
+ var reader: std.Io.Reader = .fixed(p.bytes());
+ reader.seek = p.pos;
+ defer p.pos = reader.seek;
+
+ return reader.takeLeb128(Type);
}
pub fn readIleb128(p: *InfoReader, comptime Type: type) !Type {
- var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
- var creader = std.io.countingReader(stream.reader());
- const value: Type = try leb.readIleb128(Type, creader.reader());
- p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
- return value;
+ var reader: std.Io.Reader = .fixed(p.bytes());
+ reader.seek = p.pos;
+ defer p.pos = reader.seek;
+
+ return reader.takeLeb128(Type);
}
pub fn seekTo(p: *InfoReader, off: u64) !void {
@@ -340,11 +340,11 @@ pub const AbbrevReader = struct {
}
pub fn readUleb128(p: *AbbrevReader, comptime Type: type) !Type {
- var stream = std.io.fixedBufferStream(p.bytes()[p.pos..]);
- var creader = std.io.countingReader(stream.reader());
- const value: Type = try leb.readUleb128(Type, creader.reader());
- p.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
- return value;
+ var reader: std.Io.Reader = .fixed(p.bytes());
+ reader.seek = p.pos;
+ defer p.pos = reader.seek;
+
+ return reader.takeLeb128(Type);
}
pub fn seekTo(p: *AbbrevReader, off: u64) !void {
diff --git a/src/link/MachO/Dylib.zig b/src/link/MachO/Dylib.zig
index 8dda3a74ac..497e1d6c45 100644
--- a/src/link/MachO/Dylib.zig
+++ b/src/link/MachO/Dylib.zig
@@ -159,42 +159,18 @@ fn parseBinary(self: *Dylib, macho_file: *MachO) !void {
}
const TrieIterator = struct {
- data: []const u8,
- pos: usize = 0,
-
- fn getStream(it: *TrieIterator) std.io.FixedBufferStream([]const u8) {
- return std.io.fixedBufferStream(it.data[it.pos..]);
- }
+ stream: std.Io.Reader,
fn readUleb128(it: *TrieIterator) !u64 {
- var stream = it.getStream();
- var creader = std.io.countingReader(stream.reader());
- const reader = creader.reader();
- const value = try std.leb.readUleb128(u64, reader);
- it.pos += math.cast(usize, creader.bytes_read) orelse return error.Overflow;
- return value;
+ return it.stream.takeLeb128(u64);
}
fn readString(it: *TrieIterator) ![:0]const u8 {
- var stream = it.getStream();
- const reader = stream.reader();
-
- var count: usize = 0;
- while (true) : (count += 1) {
- const byte = try reader.readByte();
- if (byte == 0) break;
- }
-
- const str = @as([*:0]const u8, @ptrCast(it.data.ptr + it.pos))[0..count :0];
- it.pos += count + 1;
- return str;
+ return it.stream.takeSentinel(0);
}
fn readByte(it: *TrieIterator) !u8 {
- var stream = it.getStream();
- const value = try stream.reader().readByte();
- it.pos += 1;
- return value;
+ return it.stream.takeByte();
}
};
@@ -243,10 +219,10 @@ fn parseTrieNode(
const label = try it.readString();
const off = try it.readUleb128();
const prefix_label = try std.fmt.allocPrint(arena, "{s}{s}", .{ prefix, label });
- const curr = it.pos;
- it.pos = math.cast(usize, off) orelse return error.Overflow;
+ const curr = it.stream.seek;
+ it.stream.seek = math.cast(usize, off) orelse return error.Overflow;
try self.parseTrieNode(it, allocator, arena, prefix_label);
- it.pos = curr;
+ it.stream.seek = curr;
}
}
@@ -257,7 +233,7 @@ fn parseTrie(self: *Dylib, data: []const u8, macho_file: *MachO) !void {
var arena = std.heap.ArenaAllocator.init(gpa);
defer arena.deinit();
- var it: TrieIterator = .{ .data = data };
+ var it: TrieIterator = .{ .stream = .fixed(data) };
try self.parseTrieNode(&it, gpa, arena.allocator(), "");
}
diff --git a/src/link/MachO/eh_frame.zig b/src/link/MachO/eh_frame.zig
index 9252dd83f4..b69fc505e2 100644
--- a/src/link/MachO/eh_frame.zig
+++ b/src/link/MachO/eh_frame.zig
@@ -17,31 +17,29 @@ pub const Cie = struct {
if (aug[0] != 'z') return; // TODO should we error out?
- var stream = std.io.fixedBufferStream(data[9 + aug.len + 1 ..]);
- var creader = std.io.countingReader(stream.reader());
- const reader = creader.reader();
+ var reader: std.Io.Reader = .fixed(data[9 + aug.len + 1 ..]);
- _ = try leb.readUleb128(u64, reader); // code alignment factor
- _ = try leb.readUleb128(u64, reader); // data alignment factor
- _ = try leb.readUleb128(u64, reader); // return address register
- _ = try leb.readUleb128(u64, reader); // augmentation data length
+ _ = try reader.takeLeb128(u64); // code alignment factor
+ _ = try reader.takeLeb128(u64); // data alignment factor
+ _ = try reader.takeLeb128(u64); // return address register
+ _ = try reader.takeLeb128(u64); // augmentation data length
for (aug[1..]) |ch| switch (ch) {
'R' => {
- const enc = try reader.readByte();
+ const enc = try reader.takeByte();
if (enc != DW_EH_PE.pcrel | DW_EH_PE.absptr) {
@panic("unexpected pointer encoding"); // TODO error
}
},
'P' => {
- const enc = try reader.readByte();
+ const enc = try reader.takeByte();
if (enc != DW_EH_PE.pcrel | DW_EH_PE.indirect | DW_EH_PE.sdata4) {
@panic("unexpected personality pointer encoding"); // TODO error
}
- _ = try reader.readInt(u32, .little); // personality pointer
+ _ = try reader.takeInt(u32, .little); // personality pointer
},
'L' => {
- const enc = try reader.readByte();
+ const enc = try reader.takeByte();
switch (enc & DW_EH_PE.type_mask) {
DW_EH_PE.sdata4 => cie.lsda_size = .p32,
DW_EH_PE.absptr => cie.lsda_size = .p64,
@@ -163,14 +161,13 @@ pub const Fde = struct {
// Parse LSDA atom index if any
if (cie.lsda_size) |lsda_size| {
- var stream = std.io.fixedBufferStream(data[24..]);
- var creader = std.io.countingReader(stream.reader());
- const reader = creader.reader();
- _ = try leb.readUleb128(u64, reader); // augmentation length
- fde.lsda_ptr_offset = @intCast(creader.bytes_read + 24);
+ var reader: std.Io.Reader = .fixed(data);
+ reader.seek = 24;
+ _ = try reader.takeLeb128(u64); // augmentation length
+ fde.lsda_ptr_offset = @intCast(reader.seek);
const lsda_ptr = switch (lsda_size) {
- .p32 => try reader.readInt(i32, .little),
- .p64 => try reader.readInt(i64, .little),
+ .p32 => try reader.takeInt(i32, .little),
+ .p64 => try reader.takeInt(i64, .little),
};
const lsda_addr: u64 = @intCast(@as(i64, @intCast(sect.addr + fde.offset + fde.lsda_ptr_offset)) + lsda_ptr);
fde.lsda = object.findAtom(lsda_addr) orelse {