diff --git a/src/Compilation.zig b/src/Compilation.zig index c76bcc37ea..687525cbf3 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -2851,6 +2851,7 @@ fn cleanupAfterUpdate(comp: *Compilation, tmp_dir_rand_int: u64) void { pub const UpdateError = error{ OutOfMemory, + Canceled, Unexpected, CurrentWorkingDirectoryUnlinked, }; @@ -2930,6 +2931,7 @@ pub fn update(comp: *Compilation, main_progress_node: std.Progress.Node) UpdateE }, }, error.OutOfMemory => return error.OutOfMemory, + error.Canceled => return error.Canceled, error.InvalidFormat => return comp.setMiscFailure( .check_whole_cache, "failed to check cache: invalid manifest file format", @@ -5010,7 +5012,7 @@ fn performAllTheWork( } } -const JobError = Allocator.Error; +const JobError = Allocator.Error || Io.Cancelable; pub fn queueJob(comp: *Compilation, job: Job) !void { try comp.work_queues[Job.stage(job)].pushBack(comp.gpa, job); @@ -5117,6 +5119,7 @@ fn processOneJob(tid: usize, comp: *Compilation, job: Job) JobError!void { pt.ensureFuncBodyUpToDate(func) catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.Canceled => |e| return e, error.AnalysisFail => return, }; }, @@ -5137,6 +5140,7 @@ fn processOneJob(tid: usize, comp: *Compilation, job: Job) JobError!void { }; maybe_err catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.Canceled => |e| return e, error.AnalysisFail => return, }; @@ -5166,7 +5170,7 @@ fn processOneJob(tid: usize, comp: *Compilation, job: Job) JobError!void { const pt: Zcu.PerThread = .activate(comp.zcu.?, @enumFromInt(tid)); defer pt.deactivate(); Type.fromInterned(ty).resolveFully(pt) catch |err| switch (err) { - error.OutOfMemory => return error.OutOfMemory, + error.OutOfMemory, error.Canceled => |e| return e, error.AnalysisFail => return, }; }, @@ -5177,7 +5181,7 @@ fn processOneJob(tid: usize, comp: *Compilation, job: Job) JobError!void { const pt: Zcu.PerThread = .activate(comp.zcu.?, @enumFromInt(tid)); defer pt.deactivate(); pt.semaMod(mod) catch |err| switch (err) { - error.OutOfMemory => return error.OutOfMemory, + error.OutOfMemory, error.Canceled => |e| return e, error.AnalysisFail => return, }; }, @@ -5190,8 +5194,8 @@ fn processOneJob(tid: usize, comp: *Compilation, job: Job) JobError!void { // TODO Surface more error details. comp.lockAndSetMiscFailure( .windows_import_lib, - "unable to generate DLL import .lib file for {s}: {s}", - .{ link_lib, @errorName(err) }, + "unable to generate DLL import .lib file for {s}: {t}", + .{ link_lib, err }, ); }; }, @@ -6066,14 +6070,10 @@ fn buildLibZigC(comp: *Compilation, prog_node: std.Progress.Node) void { }; } -fn reportRetryableCObjectError( - comp: *Compilation, - c_object: *CObject, - err: anyerror, -) error{OutOfMemory}!void { +fn reportRetryableCObjectError(comp: *Compilation, c_object: *CObject, err: anyerror) error{OutOfMemory}!void { c_object.status = .failure_retryable; - switch (comp.failCObj(c_object, "{s}", .{@errorName(err)})) { + switch (comp.failCObj(c_object, "{t}", .{err})) { error.AnalysisFail => return, else => |e| return e, } @@ -7317,7 +7317,7 @@ fn failCObj( c_object: *CObject, comptime format: []const u8, args: anytype, -) SemaError { +) error{ OutOfMemory, AnalysisFail } { @branchHint(.cold); const diag_bundle = blk: { const diag_bundle = try comp.gpa.create(CObject.Diag.Bundle); @@ -7341,7 +7341,7 @@ fn failCObjWithOwnedDiagBundle( comp: *Compilation, c_object: *CObject, diag_bundle: *CObject.Diag.Bundle, -) SemaError { +) error{ OutOfMemory, AnalysisFail } { @branchHint(.cold); assert(diag_bundle.diags.len > 0); { @@ -7357,7 +7357,7 @@ fn failCObjWithOwnedDiagBundle( return error.AnalysisFail; } -fn failWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, comptime format: []const u8, args: anytype) SemaError { +fn failWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, comptime format: []const u8, args: anytype) error{ OutOfMemory, AnalysisFail } { @branchHint(.cold); var bundle: ErrorBundle.Wip = undefined; try bundle.init(comp.gpa); @@ -7384,7 +7384,7 @@ fn failWin32ResourceWithOwnedBundle( comp: *Compilation, win32_resource: *Win32Resource, err_bundle: ErrorBundle, -) SemaError { +) error{ OutOfMemory, AnalysisFail } { @branchHint(.cold); { comp.mutex.lock(); diff --git a/src/Sema.zig b/src/Sema.zig index 2ca75e1574..324f1b6867 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6696,7 +6696,7 @@ pub fn analyzeSaveErrRetIndex(sema: *Sema, block: *Block) SemaError!Air.Inst.Ref const field_index = sema.structFieldIndex(block, stack_trace_ty, field_name, LazySrcLoc.unneeded) catch |err| switch (err) { error.AnalysisFail => @panic("std.builtin.StackTrace is corrupt"), error.ComptimeReturn, error.ComptimeBreak => unreachable, - error.OutOfMemory => |e| return e, + error.OutOfMemory, error.Canceled => |e| return e, }; return try block.addInst(.{ @@ -13924,6 +13924,7 @@ fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A return sema.fail(block, operand_src, "unable to resolve '{s}': working directory has been unlinked", .{name}); }, error.OutOfMemory => |e| return e, + error.Canceled => |e| return e, }; try sema.declareDependency(.{ .embed_file = ef_idx }); @@ -34345,7 +34346,7 @@ pub fn resolveStructLayout(sema: *Sema, ty: Type) SemaError!void { if (struct_type.layout == .@"packed") { sema.backingIntType(struct_type) catch |err| switch (err) { - error.OutOfMemory, error.AnalysisFail => |e| return e, + error.AnalysisFail, error.OutOfMemory, error.Canceled => |e| return e, error.ComptimeBreak, error.ComptimeReturn => unreachable, }; return; @@ -34893,7 +34894,7 @@ pub fn resolveStructFieldTypes( defer tracked_unit.end(zcu); sema.structFields(struct_type) catch |err| switch (err) { - error.AnalysisFail, error.OutOfMemory => |e| return e, + error.AnalysisFail, error.OutOfMemory, error.Canceled => |e| return e, error.ComptimeBreak, error.ComptimeReturn => unreachable, }; } @@ -34926,7 +34927,7 @@ pub fn resolveStructFieldInits(sema: *Sema, ty: Type) SemaError!void { defer tracked_unit.end(zcu); sema.structFieldInits(struct_type) catch |err| switch (err) { - error.AnalysisFail, error.OutOfMemory => |e| return e, + error.AnalysisFail, error.OutOfMemory, error.Canceled => |e| return e, error.ComptimeBreak, error.ComptimeReturn => unreachable, }; struct_type.setHaveFieldInits(ip); @@ -34960,7 +34961,7 @@ pub fn resolveUnionFieldTypes(sema: *Sema, ty: Type, union_type: InternPool.Load union_type.setStatus(ip, .field_types_wip); errdefer union_type.setStatus(ip, .none); sema.unionFields(ty.toIntern(), union_type) catch |err| switch (err) { - error.AnalysisFail, error.OutOfMemory => |e| return e, + error.AnalysisFail, error.OutOfMemory, error.Canceled => |e| return e, error.ComptimeBreak, error.ComptimeReturn => unreachable, }; union_type.setStatus(ip, .have_field_types); @@ -37027,6 +37028,7 @@ fn notePathToComptimeAllocPtr( const derivation = comptime_ptr.pointerDerivationAdvanced(arena, pt, false, sema) catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.Canceled => @panic("TODO"), // pls don't be cancelable mlugg error.AnalysisFail => unreachable, }; @@ -37367,7 +37369,7 @@ pub fn resolveDeclaredEnum( ) catch |err| switch (err) { error.ComptimeBreak => unreachable, error.ComptimeReturn => unreachable, - error.OutOfMemory => |e| return e, + error.OutOfMemory, error.Canceled => |e| return e, error.AnalysisFail => { if (!zcu.failed_analysis.contains(sema.owner)) { try zcu.transitive_failed_analysis.put(gpa, sema.owner, {}); diff --git a/src/Type.zig b/src/Type.zig index 3d3b36640c..3c13f3db94 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -3837,7 +3837,7 @@ fn resolveStructInner( } return error.AnalysisFail; }, - error.OutOfMemory => |e| return e, + error.OutOfMemory, error.Canceled => |e| return e, }; } @@ -3896,6 +3896,7 @@ fn resolveUnionInner( return error.AnalysisFail; }, error.OutOfMemory => |e| return e, + error.Canceled => |e| return e, }; } diff --git a/src/Value.zig b/src/Value.zig index 930f94a5a3..e2699746fa 100644 --- a/src/Value.zig +++ b/src/Value.zig @@ -1,12 +1,15 @@ -const std = @import("std"); -const builtin = @import("builtin"); const build_options = @import("build_options"); -const Type = @import("Type.zig"); +const builtin = @import("builtin"); + +const std = @import("std"); +const Io = std.Io; const assert = std.debug.assert; const BigIntConst = std.math.big.int.Const; const BigIntMutable = std.math.big.int.Mutable; const Target = std.Target; const Allocator = std.mem.Allocator; + +const Type = @import("Type.zig"); const Zcu = @import("Zcu.zig"); const Sema = @import("Sema.zig"); const InternPool = @import("InternPool.zig"); @@ -2410,6 +2413,7 @@ pub const PointerDeriveStep = union(enum) { pub fn pointerDerivation(ptr_val: Value, arena: Allocator, pt: Zcu.PerThread) Allocator.Error!PointerDeriveStep { return ptr_val.pointerDerivationAdvanced(arena, pt, false, null) catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.Canceled => @panic("TODO"), // pls remove from error set mlugg error.AnalysisFail => unreachable, }; } diff --git a/src/Zcu.zig b/src/Zcu.zig index c170ef6d71..6027ab07fa 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -2755,9 +2755,11 @@ pub const LazySrcLoc = struct { } }; -pub const SemaError = error{ OutOfMemory, AnalysisFail }; +pub const SemaError = error{ OutOfMemory, Canceled, AnalysisFail }; pub const CompileError = error{ OutOfMemory, + /// The compilation update is no longer desired. + Canceled, /// When this is returned, the compile error for the failure has already been recorded. AnalysisFail, /// In a comptime scope, a return instruction was encountered. This error is only seen when diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index 78a35fb124..702e30dab0 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -1,26 +1,31 @@ //! This type provides a wrapper around a `*Zcu` for uses which require a thread `Id`. //! Any operation which mutates `InternPool` state lives here rather than on `Zcu`. -const Air = @import("../Air.zig"); +const std = @import("std"); const Allocator = std.mem.Allocator; const assert = std.debug.assert; const Ast = std.zig.Ast; const AstGen = std.zig.AstGen; const BigIntConst = std.math.big.int.Const; const BigIntMutable = std.math.big.int.Mutable; +const Cache = std.Build.Cache; +const log = std.log.scoped(.zcu); +const mem = std.mem; +const Zir = std.zig.Zir; +const Zoir = std.zig.Zoir; +const ZonGen = std.zig.ZonGen; +const Io = std.Io; + +const Air = @import("../Air.zig"); const Builtin = @import("../Builtin.zig"); const build_options = @import("build_options"); const builtin = @import("builtin"); -const Cache = std.Build.Cache; const dev = @import("../dev.zig"); const InternPool = @import("../InternPool.zig"); const AnalUnit = InternPool.AnalUnit; const introspect = @import("../introspect.zig"); -const log = std.log.scoped(.zcu); const Module = @import("../Package.zig").Module; const Sema = @import("../Sema.zig"); -const std = @import("std"); -const mem = std.mem; const target_util = @import("../target.zig"); const trace = @import("../tracy.zig").trace; const Type = @import("../Type.zig"); @@ -29,9 +34,6 @@ const Zcu = @import("../Zcu.zig"); const Compilation = @import("../Compilation.zig"); const codegen = @import("../codegen.zig"); const crash_report = @import("../crash_report.zig"); -const Zir = std.zig.Zir; -const Zoir = std.zig.Zoir; -const ZonGen = std.zig.ZonGen; zcu: *Zcu, @@ -678,6 +680,7 @@ pub fn ensureMemoizedStateUpToDate(pt: Zcu.PerThread, stage: InternPool.Memoized // TODO: same as for `ensureComptimeUnitUpToDate` etc return error.OutOfMemory; }, + error.Canceled => |e| return e, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, }; @@ -842,6 +845,7 @@ pub fn ensureComptimeUnitUpToDate(pt: Zcu.PerThread, cu_id: InternPool.ComptimeU // for reporting OOM errors without allocating. return error.OutOfMemory; }, + error.Canceled => |e| return e, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, }; @@ -1030,6 +1034,7 @@ pub fn ensureNavValUpToDate(pt: Zcu.PerThread, nav_id: InternPool.Nav.Index) Zcu // for reporting OOM errors without allocating. return error.OutOfMemory; }, + error.Canceled => |e| return e, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, }; @@ -1443,6 +1448,7 @@ pub fn ensureNavTypeUpToDate(pt: Zcu.PerThread, nav_id: InternPool.Nav.Index) Zc // for reporting OOM errors without allocating. return error.OutOfMemory; }, + error.Canceled => |e| return e, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, }; @@ -1668,6 +1674,7 @@ pub fn ensureFuncBodyUpToDate(pt: Zcu.PerThread, func_index: InternPool.Index) Z // for reporting OOM errors without allocating. return error.OutOfMemory; }, + error.Canceled => |e| return e, }; if (was_outdated) { @@ -2360,6 +2367,7 @@ pub fn embedFile( import_string: []const u8, ) error{ OutOfMemory, + Canceled, ImportOutsideModulePath, CurrentWorkingDirectoryUnlinked, }!Zcu.EmbedFile.Index { @@ -4123,7 +4131,7 @@ fn recreateEnumType( pt: Zcu.PerThread, old_ty: InternPool.Index, key: InternPool.Key.NamespaceType.Declared, -) Allocator.Error!InternPool.Index { +) (Allocator.Error || Io.Cancelable)!InternPool.Index { const zcu = pt.zcu; const gpa = zcu.gpa; const ip = &zcu.intern_pool; @@ -4234,6 +4242,7 @@ fn recreateEnumType( body_end, ) catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.Canceled => |e| return e, error.AnalysisFail => {}, // call sites are responsible for checking `[transitive_]failed_analysis` to detect this }; diff --git a/src/print_value.zig b/src/print_value.zig index 9a44e8d7a4..28c2595427 100644 --- a/src/print_value.zig +++ b/src/print_value.zig @@ -27,6 +27,7 @@ pub fn formatSema(ctx: FormatContext, writer: *Writer) Writer.Error!void { error.OutOfMemory => @panic("OOM"), // We're not allowed to return this from a format function error.ComptimeBreak, error.ComptimeReturn => unreachable, error.AnalysisFail => unreachable, // TODO: re-evaluate when we use `sema` more fully + error.Canceled => @panic("TODO"), // pls stop returning this error mlugg else => |e| return e, }; } @@ -36,6 +37,7 @@ pub fn format(ctx: FormatContext, writer: *Writer) Writer.Error!void { return print(ctx.val, writer, ctx.depth, ctx.pt, null) catch |err| switch (err) { error.OutOfMemory => @panic("OOM"), // We're not allowed to return this from a format function error.ComptimeBreak, error.ComptimeReturn, error.AnalysisFail => unreachable, + error.Canceled => @panic("TODO"), // pls stop returning this error mlugg else => |e| return e, }; }