From a5b719e9eb0a196a43a88af8f62c897d1ecfa04f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 17 Dec 2025 23:12:11 -0800 Subject: [PATCH] compiler: fix build failures from std.Io-fs --- lib/compiler/aro/aro/Diagnostics.zig | 10 ++++----- lib/std/Io/Dir.zig | 2 +- lib/std/Io/Threaded.zig | 2 +- lib/std/zig/llvm/Builder.zig | 4 ++-- src/Compilation.zig | 32 +++++++++++----------------- src/InternPool.zig | 26 +++++++++++----------- src/Package/Fetch.zig | 15 ++++++------- src/codegen/aarch64/Select.zig | 2 +- src/codegen/llvm.zig | 18 ++++++++-------- src/libs/mingw.zig | 1 + src/link.zig | 3 +-- src/link/Elf.zig | 5 +++-- src/link/Lld.zig | 2 +- src/link/MachO.zig | 8 ++++--- src/link/MappedFile.zig | 4 ++-- src/link/Queue.zig | 1 + src/link/Wasm.zig | 3 ++- 17 files changed, 67 insertions(+), 71 deletions(-) diff --git a/lib/compiler/aro/aro/Diagnostics.zig b/lib/compiler/aro/aro/Diagnostics.zig index b33efa3f85dddc21e86f7631a90477b4bb5028dd..993b5d93af652c56eb7206545d5b1f4c915ac05a 100644 --- a/lib/compiler/aro/aro/Diagnostics.zig +++ b/lib/compiler/aro/aro/Diagnostics.zig @@ -541,11 +541,11 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void { switch (d.output) { .ignore => {}, - .to_writer => |writer| { - var config = writer.color; - if (d.color == false) config = .no_color; - if (d.color == true and config == .no_color) config = .escape_codes; - msg.write(writer.writer, config, d.details) catch { + .to_writer => |t| { + var new_mode = t.mode; + if (d.color == false) new_mode = .no_color; + if (d.color == true and new_mode == .no_color) new_mode = .escape_codes; + msg.write(.{ .writer = t.writer, .mode = new_mode }, d.details) catch { return error.FatalError; }; }, diff --git a/lib/std/Io/Dir.zig b/lib/std/Io/Dir.zig index f482f72afdd6aa983250fb4c2c1c1939ceeb4fd3..12fcea6576769a9f569915d1ea3439e1f6f56505 100644 --- a/lib/std/Io/Dir.zig +++ b/lib/std/Io/Dir.zig @@ -1739,7 +1739,7 @@ pub fn setFilePermissions( new_permissions: File.Permissions, options: SetFilePermissionsOptions, ) SetFilePermissionsError!void { - return io.vtable.dirSetFilePermissions(io.userdata, sub_path, dir, new_permissions, options); + return io.vtable.dirSetFilePermissions(io.userdata, dir, sub_path, new_permissions, options); } pub const SetOwnerError = File.SetOwnerError; diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index b07a9bb9a87a8bd4d2e798a4a1f0e2513a3742b3..ca10272b333cf917bba41afadb79ddbc05b26613 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -10139,7 +10139,7 @@ fn initLockedStderr( t.stderr_writer.interface.buffer = buffer; return .{ .file_writer = &t.stderr_writer, - .terminal_mode = t.stderr_mode, + .terminal_mode = terminal_mode orelse t.stderr_mode, }; } diff --git a/lib/std/zig/llvm/Builder.zig b/lib/std/zig/llvm/Builder.zig index 251c87defc21b0dfd19b0d3a71c0b66b0d32673e..66d20df34810c62e2741ed066906a519032af6ef 100644 --- a/lib/std/zig/llvm/Builder.zig +++ b/lib/std/zig/llvm/Builder.zig @@ -9576,10 +9576,10 @@ pub fn asmValue( return (try self.asmConst(ty, info, assembly, constraints)).toValue(); } -pub fn dump(b: *Builder) void { +pub fn dump(b: *Builder, io: Io) void { var buffer: [4000]u8 = undefined; const stderr: Io.File = .stderr(); - b.printToFile(stderr, &buffer) catch {}; + b.printToFile(io, stderr, &buffer) catch {}; } pub fn printToFilePath(b: *Builder, io: Io, dir: Io.Dir, path: []const u8) !void { diff --git a/src/Compilation.zig b/src/Compilation.zig index f3fcef40a014d326f6509188b79ef7f726b2d11c..a78bf19e666a6e7027741dd7ca430c77f553ef2a 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -2101,6 +2101,7 @@ pub fn create(gpa: Allocator, arena: Allocator, io: Io, diag: *CreateDiagnostic, error.Canceled => |e| return e, else => {}, }, + error.OutOfMemory => |e| return e, }; } } @@ -2708,7 +2709,7 @@ fn printVerboseLlvmCpuFeatures( root_name: []const u8, target: *const std.Target, cf: [*:0]const u8, -) Writer.Error!void { +) (Writer.Error || Allocator.Error)!void { try w.print("compilation: {s}\n", .{root_name}); try w.print(" target: {s}\n", .{try target.zigTriple(arena)}); try w.print(" cpu: {s}\n", .{target.cpu.model.name}); @@ -3113,7 +3114,7 @@ pub fn update(comp: *Compilation, main_progress_node: std.Progress.Node) UpdateE if (build_options.enable_debug_extensions and comp.verbose_intern_pool) { std.debug.print("intern pool stats for '{s}':\n", .{comp.root_name}); - zcu.intern_pool.dump(io); + zcu.intern_pool.dump(); } if (build_options.enable_debug_extensions and comp.verbose_generic_instances) { @@ -3320,11 +3321,8 @@ pub fn resolveEmitPathFlush( }, } } -fn flush( - comp: *Compilation, - arena: Allocator, - tid: Zcu.PerThread.Id, -) Allocator.Error!void { + +fn flush(comp: *Compilation, arena: Allocator, tid: Zcu.PerThread.Id) (Io.Cancelable || Allocator.Error)!void { const io = comp.io; if (comp.zcu) |zcu| { if (zcu.llvm_object) |llvm_object| { @@ -3390,7 +3388,7 @@ fn flush( // This is needed before reading the error flags. lf.flush(arena, tid, comp.link_prog_node) catch |err| switch (err) { error.LinkFailure => {}, // Already reported. - error.OutOfMemory => return error.OutOfMemory, + error.OutOfMemory, error.Canceled => |e| return e, }; } if (comp.zcu) |zcu| { @@ -3614,6 +3612,7 @@ fn emitFromCObject( new_ext: []const u8, unresolved_emit_path: []const u8, ) Allocator.Error!void { + const io = comp.io; // The dirname and stem (i.e. everything but the extension), of the sub path of the C object. // We'll append `new_ext` to it to get the path to the right thing (asm, LLVM IR, etc). const c_obj_dir_and_stem: []const u8 = p: { @@ -3623,23 +3622,18 @@ fn emitFromCObject( }; const src_path: Cache.Path = .{ .root_dir = c_obj_path.root_dir, - .sub_path = try std.fmt.allocPrint(arena, "{s}{s}", .{ - c_obj_dir_and_stem, - new_ext, - }), + .sub_path = try std.fmt.allocPrint(arena, "{s}{s}", .{ c_obj_dir_and_stem, new_ext }), }; const emit_path = comp.resolveEmitPath(unresolved_emit_path); - src_path.root_dir.handle.copyFile( + Io.Dir.copyFile( + src_path.root_dir.handle, src_path.sub_path, emit_path.root_dir.handle, emit_path.sub_path, + io, .{}, - ) catch |err| log.err("unable to copy '{f}' to '{f}': {s}", .{ - src_path, - emit_path, - @errorName(err), - }); + ) catch |err| log.err("unable to copy '{f}' to '{f}': {t}", .{ src_path, emit_path, err }); } /// Having the file open for writing is problematic as far as executing the @@ -7787,7 +7781,7 @@ pub fn lockAndSetMiscFailure( pub fn dumpArgv(io: Io, argv: []const []const u8) Io.Cancelable!void { var buffer: [64]u8 = undefined; - const stderr = try io.lockStderr(&buffer); + const stderr = try io.lockStderr(&buffer, null); defer io.unlockStderr(); const w = &stderr.file_writer.interface; return dumpArgvWriter(w, argv) catch |err| switch (err) { diff --git a/src/InternPool.zig b/src/InternPool.zig index 98bde244c5a01382b4b94ece3f47bf211e95c140..3076aa2cf36490aba4f400e581485edbc1e20b98 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -11167,16 +11167,16 @@ pub fn mutateVarInit(ip: *InternPool, io: Io, index: Index, init_index: Index) v @atomicStore(u32, &extra_items[item.data + std.meta.fieldIndex(Tag.Variable, "init").?], @intFromEnum(init_index), .release); } -pub fn dump(ip: *const InternPool, io: Io) Io.Cancelable!void { +pub fn dump(ip: *const InternPool) void { var buffer: [4096]u8 = undefined; - const stderr = try io.lockStderr(&buffer, null); - defer io.unlockStderr(); + const stderr = std.debug.lockStderr(&buffer); + defer std.debug.unlockStderr(); const w = &stderr.file_writer.interface; - try dumpStatsFallible(ip, w, std.heap.page_allocator); - try dumpAllFallible(ip, w); + dumpStatsFallible(ip, w, std.heap.page_allocator) catch return; + dumpAllFallible(ip, w) catch return; } -fn dumpStatsFallible(ip: *const InternPool, w: *Io.Writer, arena: Allocator) anyerror!void { +fn dumpStatsFallible(ip: *const InternPool, w: *Io.Writer, arena: Allocator) !void { var items_len: usize = 0; var extra_len: usize = 0; var limbs_len: usize = 0; @@ -11429,9 +11429,9 @@ fn dumpStatsFallible(ip: *const InternPool, w: *Io.Writer, arena: Allocator) any }; counts.sort(SortContext{ .map = &counts }); const len = @min(50, counts.count()); - w.print(" top 50 tags:\n", .{}); + try w.print(" top 50 tags:\n", .{}); for (counts.keys()[0..len], counts.values()[0..len]) |tag, stats| { - w.print(" {t}: {d} occurrences, {d} total bytes\n", .{ tag, stats.count, stats.bytes }); + try w.print(" {t}: {d} occurrences, {d} total bytes\n", .{ tag, stats.count, stats.bytes }); } } @@ -11534,12 +11534,12 @@ fn dumpAllFallible(ip: *const InternPool, w: *Io.Writer) anyerror!void { } } -pub fn dumpGenericInstances(ip: *const InternPool, io: Io, allocator: Allocator) Io.Cancelable!void { +pub fn dumpGenericInstances(ip: *const InternPool, allocator: Allocator) void { var buffer: [4096]u8 = undefined; - const stderr_writer = try io.lockStderr(&buffer, null); - defer io.unlockStderr(); - const w = &stderr_writer.interface; - try ip.dumpGenericInstancesFallible(allocator, w); + const stderr = std.debug.lockStderr(&buffer); + defer std.debug.unlockStderr(); + const w = &stderr.file_writer.interface; + ip.dumpGenericInstancesFallible(allocator, w) catch return; } pub fn dumpGenericInstancesFallible(ip: *const InternPool, allocator: Allocator, w: *Io.Writer) !void { diff --git a/src/Package/Fetch.zig b/src/Package/Fetch.zig index 823015574b52ccd54c89dab55586a6dfc2f39bdf..b17b39cd8389dd84e86d42ea7a25f9b59f800952 100644 --- a/src/Package/Fetch.zig +++ b/src/Package/Fetch.zig @@ -1682,18 +1682,18 @@ fn hashFileFallible(io: Io, dir: Io.Dir, hashed_file: *HashedFile) HashedFile.Er hasher.update(&.{ 0, 0 }); var file_header: FileHeader = .{}; while (true) { - const bytes_read = try file.read(&buf); + const bytes_read = try file.readPositional(io, &.{&buf}, file_size); if (bytes_read == 0) break; file_size += bytes_read; hasher.update(buf[0..bytes_read]); file_header.update(buf[0..bytes_read]); } if (file_header.isExecutable()) { - try setExecutable(file); + try setExecutable(io, file); } }, .link => { - const link_name = try dir.readLink(io, hashed_file.fs_path, &buf); + const link_name = buf[0..try dir.readLink(io, hashed_file.fs_path, &buf)]; if (fs.path.sep != canonical_sep) { // Package hashes are intended to be consistent across // platforms which means we must normalize path separators @@ -1711,12 +1711,9 @@ fn deleteFileFallible(io: Io, dir: Io.Dir, deleted_file: *DeletedFile) DeletedFi try dir.deleteFile(io, deleted_file.fs_path); } -fn setExecutable(file: Io.File) !void { +fn setExecutable(io: Io, file: Io.File) !void { if (!Io.File.Permissions.has_executable_bit) return; - - const S = std.posix.S; - const mode = Io.File.default_mode | S.IXUSR | S.IXGRP | S.IXOTH; - try file.chmod(mode); + try file.setPermissions(io, .executable_file); } const DeletedFile = struct { @@ -1738,7 +1735,7 @@ const HashedFile = struct { const Error = Io.File.OpenError || - Io.File.Reader.Error || + Io.File.ReadPositionalError || Io.File.StatError || Io.File.SetPermissionsError || Io.Dir.ReadLinkError; diff --git a/src/codegen/aarch64/Select.zig b/src/codegen/aarch64/Select.zig index 93a6e0a7687f5f28dd8a30b344dcaa223701eeb8..49de055b47b6b55a3119ce52065888af61d8b0f8 100644 --- a/src/codegen/aarch64/Select.zig +++ b/src/codegen/aarch64/Select.zig @@ -11280,7 +11280,7 @@ pub fn dumpValues(isel: *Select, which: enum { only_referenced, all }) void { errdefer |err| @panic(@errorName(err)); - const locked_stderr = std.debug.lockStderr(&.{}, null); + const locked_stderr = std.debug.lockStderr(&.{}); defer std.debug.unlockStderr(); const stderr = &locked_stderr.file_writer.interface; diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 4fc58c2c4b0d59e93d65e6a327dc5d1b29f35fd3..fca89ea4fcf126c34dea9f705987687ffc1e143a 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -965,10 +965,10 @@ pub const Object = struct { const context, const module = emit: { if (options.pre_ir_path) |path| { if (std.mem.eql(u8, path, "-")) { - o.builder.dump(); + o.builder.dump(io); } else { - o.builder.printToFilePath(Io.Dir.cwd(), path) catch |err| { - log.err("failed printing LLVM module to \"{s}\": {s}", .{ path, @errorName(err) }); + o.builder.printToFilePath(io, Io.Dir.cwd(), path) catch |err| { + log.err("failed printing LLVM module to \"{s}\": {t}", .{ path, err }); }; } } @@ -982,12 +982,12 @@ pub const Object = struct { if (options.pre_bc_path) |path| { var file = Io.Dir.cwd().createFile(io, path, .{}) catch |err| - return diags.fail("failed to create '{s}': {s}", .{ path, @errorName(err) }); + return diags.fail("failed to create '{s}': {t}", .{ path, err }); defer file.close(io); const ptr: [*]const u8 = @ptrCast(bitcode.ptr); - file.writeAll(ptr[0..(bitcode.len * 4)]) catch |err| - return diags.fail("failed to write to '{s}': {s}", .{ path, @errorName(err) }); + file.writeStreamingAll(io, ptr[0..(bitcode.len * 4)]) catch |err| + return diags.fail("failed to write to '{s}': {t}", .{ path, err }); } if (options.asm_path == null and options.bin_path == null and @@ -995,12 +995,12 @@ pub const Object = struct { if (options.post_bc_path) |path| { var file = Io.Dir.cwd().createFile(io, path, .{}) catch |err| - return diags.fail("failed to create '{s}': {s}", .{ path, @errorName(err) }); + return diags.fail("failed to create '{s}': {t}", .{ path, err }); defer file.close(io); const ptr: [*]const u8 = @ptrCast(bitcode.ptr); - file.writeAll(ptr[0..(bitcode.len * 4)]) catch |err| - return diags.fail("failed to write to '{s}': {s}", .{ path, @errorName(err) }); + file.writeStreamingAll(io, ptr[0..(bitcode.len * 4)]) catch |err| + return diags.fail("failed to write to '{s}': {t}", .{ path, err }); } if (!build_options.have_llvm or !comp.config.use_lib_llvm) { diff --git a/src/libs/mingw.zig b/src/libs/mingw.zig index 8cf1dfa3033e5d157120deabd1b46b370b05cb18..c4b002f983ad66b7db3f8d1679ade064d169cd8b 100644 --- a/src/libs/mingw.zig +++ b/src/libs/mingw.zig @@ -345,6 +345,7 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void { if (msg.kind == .@"fatal error" or msg.kind == .@"error") { msg.write(stderr.terminal(), true) catch |err| switch (err) { error.WriteFailed => return stderr.file_writer.err.?, + error.Unexpected => |e| return e, }; return error.AroPreprocessorFailed; } diff --git a/src/link.zig b/src/link.zig index 3b822b2e691f1a987a770ba20a2511f8204ad8cb..13306b90a4ca0e06d8401aa7a17f5a3e5fa3554d 100644 --- a/src/link.zig +++ b/src/link.zig @@ -900,10 +900,9 @@ pub const File = struct { } } - pub const FlushError = error{ + pub const FlushError = Io.Cancelable || Allocator.Error || error{ /// Indicates an error will be present in `Compilation.link_diags`. LinkFailure, - OutOfMemory, }; /// Commit pending changes and write headers. Takes into account final output mode. diff --git a/src/link/Elf.zig b/src/link/Elf.zig index a312138c044c6dd2767e7f5586f2e403622ee4e6..85f37f88ce8b55c984f6d1e5c97c689b80659d4b 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -748,9 +748,10 @@ pub fn flush(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: std defer tracy.end(); const comp = self.base.comp; + const io = comp.io; const diags = &comp.link_diags; - if (comp.verbose_link) Compilation.dump_argv(self.dump_argv_list.items); + if (comp.verbose_link) try Compilation.dumpArgv(io, self.dump_argv_list.items); const sub_prog_node = prog_node.start("ELF Flush", 0); defer sub_prog_node.end(); @@ -758,7 +759,7 @@ pub fn flush(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: std return flushInner(self, arena, tid) catch |err| switch (err) { error.OutOfMemory => return error.OutOfMemory, error.LinkFailure => return error.LinkFailure, - else => |e| return diags.fail("ELF flush failed: {s}", .{@errorName(e)}), + else => |e| return diags.fail("ELF flush failed: {t}", .{e}), }; } diff --git a/src/link/Lld.zig b/src/link/Lld.zig index 8ba91905a8e09fb1c246df3d801450df6a19c390..b2a0f6e396399307fddbd2e04ea7255461163f56 100644 --- a/src/link/Lld.zig +++ b/src/link/Lld.zig @@ -1588,7 +1588,7 @@ fn spawnLld(comp: *Compilation, arena: Allocator, argv: []const []const u8) !voi if (comp.verbose_link) { // Skip over our own name so that the LLD linker name is the first argv item. - Compilation.dump_argv(argv[1..]); + try Compilation.dumpArgv(io, argv[1..]); } // If possible, we run LLD as a child process because it does not always diff --git a/src/link/MachO.zig b/src/link/MachO.zig index cd9674a390504b7ccec26dc28ada18e895293a72..b3c62db2dfecab9a57d931458fad4d1f4a5b712a 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -618,14 +618,16 @@ pub fn flush( }; const emit = self.base.emit; invalidateKernelCache(emit.root_dir.handle, emit.sub_path) catch |err| switch (err) { - else => |e| return diags.fail("failed to invalidate kernel cache: {s}", .{@errorName(e)}), + else => |e| return diags.fail("failed to invalidate kernel cache: {t}", .{e}), }; } } /// --verbose-link output fn dumpArgv(self: *MachO, comp: *Compilation) !void { - const gpa = self.base.comp.gpa; + const gpa = comp.gpa; + const io = comp.io; + var arena_allocator = std.heap.ArenaAllocator.init(gpa); defer arena_allocator.deinit(); const arena = arena_allocator.allocator(); @@ -820,7 +822,7 @@ fn dumpArgv(self: *MachO, comp: *Compilation) !void { if (comp.ubsan_rt_obj) |obj| try argv.append(try obj.full_object_path.toString(arena)); } - Compilation.dump_argv(argv.items); + try Compilation.dumpArgv(io, argv.items); } /// TODO delete this, libsystem must be resolved when setting up the compilation pipeline diff --git a/src/link/MappedFile.zig b/src/link/MappedFile.zig index dca3dca503beb11992595de3cabcd9a541e34921..2986e27e242dfaff97ce0bc9334aed1e617cb6e4 100644 --- a/src/link/MappedFile.zig +++ b/src/link/MappedFile.zig @@ -476,8 +476,8 @@ pub const Node = extern struct { return n; }, .streaming, - .streaming_reading, - .positional_reading, + .streaming_simple, + .positional_simple, .failure, => { const dest = limit.slice(interface.unusedCapacitySlice()); diff --git a/src/link/Queue.zig b/src/link/Queue.zig index e8e7700695955ce6999efb771a1a8d292772ab94..caa2cc189816f0a0e4565eec8de66fdffcb059e3 100644 --- a/src/link/Queue.zig +++ b/src/link/Queue.zig @@ -175,6 +175,7 @@ fn runLinkTasks(q: *Queue, comp: *Compilation) void { lf.post_prelink = true; } else |err| switch (err) { error.OutOfMemory => comp.link_diags.setAllocFailure(), + error.Canceled => @panic("TODO"), error.LinkFailure => {}, } } diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index a8140327e53540da002992ba7e19812c6553ef25..216a641db3bfdf96f6c41d1b79ecf956fa6dc21a 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -3828,8 +3828,9 @@ pub fn flush( const comp = wasm.base.comp; const diags = &comp.link_diags; const gpa = comp.gpa; + const io = comp.io; - if (comp.verbose_link) Compilation.dump_argv(wasm.dump_argv_list.items); + if (comp.verbose_link) try Compilation.dumpArgv(io, wasm.dump_argv_list.items); if (wasm.base.zcu_object_basename) |raw| { const zcu_obj_path: Path = try comp.resolveEmitPathFlush(arena, .temp, raw); -- 2.54.0