diff --git a/src/Zcu.zig b/src/Zcu.zig index 1cbfe0175d..10fec614d1 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -2817,12 +2817,18 @@ comptime { } pub fn loadZirCache(gpa: Allocator, cache_file: std.fs.File) !Zir { - var header: Zir.Header = undefined; - if (try cache_file.readAll(std.mem.asBytes(&header)) < @sizeOf(Zir.Header)) return error.EndOfStream; - return loadZirCacheBody(gpa, header, cache_file); + var cache_fr = cache_file.reader(); + var cache_br = cache_fr.interface().unbuffered(); + return result: { + const header = cache_br.takeStruct(Zir.Header) catch |err| break :result err; + break :result loadZirCacheBody(gpa, header.*, &cache_br); + } catch |err| switch (err) { + error.ReadFailed => return cache_fr.err.?, + else => |e| return e, + }; } -pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.File) !Zir { +pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_br: *std.io.BufferedReader) !Zir { var instructions: std.MultiArrayList(Zir.Inst) = .{}; errdefer instructions.deinit(gpa); @@ -2850,16 +2856,11 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F if (data_has_safety_tag) @ptrCast(safety_buffer) else - zir.instructions.items(.data), + @ptrCast(zir.instructions.items(.data)), zir.string_bytes, @ptrCast(zir.extra), }; - var cache_fr = cache_file.reader(); - var cache_br = cache_fr.interface().unbuffered(); - cache_br.readVecAll(&vecs) catch |err| switch (err) { - error.ReadFailed => return cache_fr.err.?, - error.EndOfStream => return error.UnexpectedFileSize, - }; + try cache_br.readVecAll(&vecs); if (data_has_safety_tag) { const tags = zir.instructions.items(.tag); for (zir.instructions.items(.data), 0..) |*data, i| { @@ -2871,7 +2872,6 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F }; } } - return zir; } @@ -2947,7 +2947,7 @@ pub fn saveZoirCache(cache_file: std.fs.File, stat: std.fs.File.Stat, zoir: Zoir }; } -pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs.File) !Zoir { +pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_br: *std.io.BufferedReader) !Zoir { var zoir: Zoir = .{ .nodes = .empty, .extra = &.{}, @@ -2983,12 +2983,7 @@ pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs @ptrCast(zoir.compile_errors), @ptrCast(zoir.error_notes), }; - var cache_fr = cache_file.reader(); - var cache_br = cache_fr.interface().unbuffered(); - cache_br.readVecAll(&vecs) catch |err| switch (err) { - error.ReadFailed => return cache_fr.err.?, - error.EndOfStream => return error.UnexpectedFileSize, - }; + try cache_br.readVecAll(&vecs); return zoir; } diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index e8c331b5cc..2fbead2f37 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -349,6 +349,7 @@ fn loadZirZoirCache( // First we read the header to determine the lengths of arrays. const header = (cache_br.takeStruct(Header) catch |err| switch (err) { + error.ReadFailed => return cache_fr.err.?, // This can happen if Zig bails out of this function between creating // the cached file and writing it. error.EndOfStream => return .invalid, @@ -365,17 +366,15 @@ fn loadZirZoirCache( } switch (mode) { - .zig => { - file.zir = Zcu.loadZirCacheBody(gpa, header, cache_file) catch |err| switch (err) { - error.UnexpectedFileSize => return .truncated, - else => |e| return e, - }; + .zig => file.zir = Zcu.loadZirCacheBody(gpa, header, &cache_br) catch |err| switch (err) { + error.ReadFailed => return cache_fr.err.?, + error.EndOfStream => return .truncated, + else => |e| return e, }, - .zon => { - file.zoir = Zcu.loadZoirCacheBody(gpa, header, cache_file) catch |err| switch (err) { - error.UnexpectedFileSize => return .truncated, - else => |e| return e, - }; + .zon => file.zoir = Zcu.loadZoirCacheBody(gpa, header, &cache_br) catch |err| switch (err) { + error.ReadFailed => return cache_fr.err.?, + error.EndOfStream => return .truncated, + else => |e| return e, }, } diff --git a/src/main.zig b/src/main.zig index 70805c1165..e810cbf402 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6359,7 +6359,8 @@ fn cmdDumpZir( const zir = try Zcu.loadZirCache(arena, f); - var stdout_bw = fs.File.stdout().writer().buffered(&stdio_buffer); + var stdout_fw = fs.File.stdout().writer(); + var stdout_bw = stdout_fw.interface().buffered(&stdio_buffer); { const instruction_bytes = zir.instructions.len * // Here we don't use @sizeOf(Zir.Inst.Data) because it would include