authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-04-22 00:02:55-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:28-07:00
log650bc19ff33cc6b48cca154b3740301ff0b02001
treeb21d2b5def7068de1964cf141b5307f15d94c714
parentfceec91f7787613256d95b20891c18659adc0494

Zcu: fix cached z(o)ir loading


3 files changed, 25 insertions(+), 30 deletions(-)

src/Zcu.zig+14-19
......@@ -2817,12 +2817,18 @@ comptime {
28172817}
28182818
28192819pub fn loadZirCache(gpa: Allocator, cache_file: std.fs.File) !Zir {
2820 var header: Zir.Header = undefined;
2821 if (try cache_file.readAll(std.mem.asBytes(&header)) < @sizeOf(Zir.Header)) return error.EndOfStream;
2822 return loadZirCacheBody(gpa, header, cache_file);
2820 var cache_fr = cache_file.reader();
2821 var cache_br = cache_fr.interface().unbuffered();
2822 return result: {
2823 const header = cache_br.takeStruct(Zir.Header) catch |err| break :result err;
2824 break :result loadZirCacheBody(gpa, header.*, &cache_br);
2825 } catch |err| switch (err) {
2826 error.ReadFailed => return cache_fr.err.?,
2827 else => |e| return e,
2828 };
28232829}
28242830
2825pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.File) !Zir {
2831pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_br: *std.io.BufferedReader) !Zir {
28262832 var instructions: std.MultiArrayList(Zir.Inst) = .{};
28272833 errdefer instructions.deinit(gpa);
28282834
......@@ -2850,16 +2856,11 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F
28502856 if (data_has_safety_tag)
28512857 @ptrCast(safety_buffer)
28522858 else
2853 zir.instructions.items(.data),
2859 @ptrCast(zir.instructions.items(.data)),
28542860 zir.string_bytes,
28552861 @ptrCast(zir.extra),
28562862 };
2857 var cache_fr = cache_file.reader();
2858 var cache_br = cache_fr.interface().unbuffered();
2859 cache_br.readVecAll(&vecs) catch |err| switch (err) {
2860 error.ReadFailed => return cache_fr.err.?,
2861 error.EndOfStream => return error.UnexpectedFileSize,
2862 };
2863 try cache_br.readVecAll(&vecs);
28632864 if (data_has_safety_tag) {
28642865 const tags = zir.instructions.items(.tag);
28652866 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
28712872 };
28722873 }
28732874 }
2874
28752875 return zir;
28762876}
28772877
......@@ -2947,7 +2947,7 @@ pub fn saveZoirCache(cache_file: std.fs.File, stat: std.fs.File.Stat, zoir: Zoir
29472947 };
29482948}
29492949
2950pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs.File) !Zoir {
2950pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_br: *std.io.BufferedReader) !Zoir {
29512951 var zoir: Zoir = .{
29522952 .nodes = .empty,
29532953 .extra = &.{},
......@@ -2983,12 +2983,7 @@ pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs
29832983 @ptrCast(zoir.compile_errors),
29842984 @ptrCast(zoir.error_notes),
29852985 };
2986 var cache_fr = cache_file.reader();
2987 var cache_br = cache_fr.interface().unbuffered();
2988 cache_br.readVecAll(&vecs) catch |err| switch (err) {
2989 error.ReadFailed => return cache_fr.err.?,
2990 error.EndOfStream => return error.UnexpectedFileSize,
2991 };
2986 try cache_br.readVecAll(&vecs);
29922987 return zoir;
29932988}
29942989
src/Zcu/PerThread.zig+9-10
......@@ -349,6 +349,7 @@ fn loadZirZoirCache(
349349
350350 // First we read the header to determine the lengths of arrays.
351351 const header = (cache_br.takeStruct(Header) catch |err| switch (err) {
352 error.ReadFailed => return cache_fr.err.?,
352353 // This can happen if Zig bails out of this function between creating
353354 // the cached file and writing it.
354355 error.EndOfStream => return .invalid,
......@@ -365,17 +366,15 @@ fn loadZirZoirCache(
365366 }
366367
367368 switch (mode) {
368 .zig => {
369 file.zir = Zcu.loadZirCacheBody(gpa, header, cache_file) catch |err| switch (err) {
370 error.UnexpectedFileSize => return .truncated,
371 else => |e| return e,
372 };
369 .zig => file.zir = Zcu.loadZirCacheBody(gpa, header, &cache_br) catch |err| switch (err) {
370 error.ReadFailed => return cache_fr.err.?,
371 error.EndOfStream => return .truncated,
372 else => |e| return e,
373373 },
374 .zon => {
375 file.zoir = Zcu.loadZoirCacheBody(gpa, header, cache_file) catch |err| switch (err) {
376 error.UnexpectedFileSize => return .truncated,
377 else => |e| return e,
378 };
374 .zon => file.zoir = Zcu.loadZoirCacheBody(gpa, header, &cache_br) catch |err| switch (err) {
375 error.ReadFailed => return cache_fr.err.?,
376 error.EndOfStream => return .truncated,
377 else => |e| return e,
379378 },
380379 }
381380
src/main.zig+2-1
......@@ -6359,7 +6359,8 @@ fn cmdDumpZir(
63596359
63606360 const zir = try Zcu.loadZirCache(arena, f);
63616361
6362 var stdout_bw = fs.File.stdout().writer().buffered(&stdio_buffer);
6362 var stdout_fw = fs.File.stdout().writer();
6363 var stdout_bw = stdout_fw.interface().buffered(&stdio_buffer);
63636364 {
63646365 const instruction_bytes = zir.instructions.len *
63656366 // Here we don't use @sizeOf(Zir.Inst.Data) because it would include