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 {...@@ -2817,12 +2817,18 @@ comptime {
2817}2817}
28182818
2819pub fn loadZirCache(gpa: Allocator, cache_file: std.fs.File) !Zir {2819pub fn loadZirCache(gpa: Allocator, cache_file: std.fs.File) !Zir {
2820 var header: Zir.Header = undefined;2820 var cache_fr = cache_file.reader();
2821 if (try cache_file.readAll(std.mem.asBytes(&header)) < @sizeOf(Zir.Header)) return error.EndOfStream;2821 var cache_br = cache_fr.interface().unbuffered();
2822 return loadZirCacheBody(gpa, header, cache_file);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 };
2823}2829}
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 {
2826 var instructions: std.MultiArrayList(Zir.Inst) = .{};2832 var instructions: std.MultiArrayList(Zir.Inst) = .{};
2827 errdefer instructions.deinit(gpa);2833 errdefer instructions.deinit(gpa);
28282834
...@@ -2850,16 +2856,11 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F...@@ -2850,16 +2856,11 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F
2850 if (data_has_safety_tag)2856 if (data_has_safety_tag)
2851 @ptrCast(safety_buffer)2857 @ptrCast(safety_buffer)
2852 else2858 else
2853 zir.instructions.items(.data),2859 @ptrCast(zir.instructions.items(.data)),
2854 zir.string_bytes,2860 zir.string_bytes,
2855 @ptrCast(zir.extra),2861 @ptrCast(zir.extra),
2856 };2862 };
2857 var cache_fr = cache_file.reader();2863 try cache_br.readVecAll(&vecs);
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 if (data_has_safety_tag) {2864 if (data_has_safety_tag) {
2864 const tags = zir.instructions.items(.tag);2865 const tags = zir.instructions.items(.tag);
2865 for (zir.instructions.items(.data), 0..) |*data, i| {2866 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...@@ -2871,7 +2872,6 @@ pub fn loadZirCacheBody(gpa: Allocator, header: Zir.Header, cache_file: std.fs.F
2871 };2872 };
2872 }2873 }
2873 }2874 }
2874
2875 return zir;2875 return zir;
2876}2876}
28772877
...@@ -2947,7 +2947,7 @@ pub fn saveZoirCache(cache_file: std.fs.File, stat: std.fs.File.Stat, zoir: Zoir...@@ -2947,7 +2947,7 @@ pub fn saveZoirCache(cache_file: std.fs.File, stat: std.fs.File.Stat, zoir: Zoir
2947 };2947 };
2948}2948}
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 {
2951 var zoir: Zoir = .{2951 var zoir: Zoir = .{
2952 .nodes = .empty,2952 .nodes = .empty,
2953 .extra = &.{},2953 .extra = &.{},
...@@ -2983,12 +2983,7 @@ pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs...@@ -2983,12 +2983,7 @@ pub fn loadZoirCacheBody(gpa: Allocator, header: Zoir.Header, cache_file: std.fs
2983 @ptrCast(zoir.compile_errors),2983 @ptrCast(zoir.compile_errors),
2984 @ptrCast(zoir.error_notes),2984 @ptrCast(zoir.error_notes),
2985 };2985 };
2986 var cache_fr = cache_file.reader();2986 try cache_br.readVecAll(&vecs);
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 };
2992 return zoir;2987 return zoir;
2993}2988}
29942989
src/Zcu/PerThread.zig+9-10
...@@ -349,6 +349,7 @@ fn loadZirZoirCache(...@@ -349,6 +349,7 @@ fn loadZirZoirCache(
349349
350 // First we read the header to determine the lengths of arrays.350 // First we read the header to determine the lengths of arrays.
351 const header = (cache_br.takeStruct(Header) catch |err| switch (err) {351 const header = (cache_br.takeStruct(Header) catch |err| switch (err) {
352 error.ReadFailed => return cache_fr.err.?,
352 // This can happen if Zig bails out of this function between creating353 // This can happen if Zig bails out of this function between creating
353 // the cached file and writing it.354 // the cached file and writing it.
354 error.EndOfStream => return .invalid,355 error.EndOfStream => return .invalid,
...@@ -365,17 +366,15 @@ fn loadZirZoirCache(...@@ -365,17 +366,15 @@ fn loadZirZoirCache(
365 }366 }
366367
367 switch (mode) {368 switch (mode) {
368 .zig => {369 .zig => file.zir = Zcu.loadZirCacheBody(gpa, header, &cache_br) catch |err| switch (err) {
369 file.zir = Zcu.loadZirCacheBody(gpa, header, cache_file) catch |err| switch (err) {370 error.ReadFailed => return cache_fr.err.?,
370 error.UnexpectedFileSize => return .truncated,371 error.EndOfStream => return .truncated,
371 else => |e| return e,372 else => |e| return e,
372 };
373 },373 },
374 .zon => {374 .zon => file.zoir = Zcu.loadZoirCacheBody(gpa, header, &cache_br) catch |err| switch (err) {
375 file.zoir = Zcu.loadZoirCacheBody(gpa, header, cache_file) catch |err| switch (err) {375 error.ReadFailed => return cache_fr.err.?,
376 error.UnexpectedFileSize => return .truncated,376 error.EndOfStream => return .truncated,
377 else => |e| return e,377 else => |e| return e,
378 };
379 },378 },
380 }379 }
381380
src/main.zig+2-1
...@@ -6359,7 +6359,8 @@ fn cmdDumpZir(...@@ -6359,7 +6359,8 @@ fn cmdDumpZir(
63596359
6360 const zir = try Zcu.loadZirCache(arena, f);6360 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);
6363 {6364 {
6364 const instruction_bytes = zir.instructions.len *6365 const instruction_bytes = zir.instructions.len *
6365 // Here we don't use @sizeOf(Zir.Inst.Data) because it would include6366 // Here we don't use @sizeOf(Zir.Inst.Data) because it would include