diff options
| author | Matthew Lugg <mlugg@mlugg.co.uk> | 2025-01-22 16:48:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-22 16:48:27 +0000 |
| commit | 0e815c652d7908be62612bb931c2ee9698dd41da (patch) | |
| tree | 2fdefb0b7575805af532ed4fb60057d1cb3dc206 /src/Sema.zig | |
| parent | 61fe307d0f05eea901577900f4ab2bdaf0ffb35f (diff) | |
| parent | d4b6a53327352dc239644dab0ec2abbe3a1b1be9 (diff) | |
| download | zig-0e815c652d7908be62612bb931c2ee9698dd41da.tar.gz zig-0e815c652d7908be62612bb931c2ee9698dd41da.zip | |
Merge pull request #22572 from jacobly0/new-error-trace
compiler: include error trace in all functions, implement for x86_64 backend
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index fb9b27a8cd..833b05413f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7198,14 +7198,6 @@ fn zirCall( const call_dbg_node: Zir.Inst.Index = @enumFromInt(@intFromEnum(inst) - 1); const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call); - switch (sema.owner.unwrap()) { - .@"comptime", .type, .memoized_state, .nav_ty, .nav_val => input_is_error = false, - .func => |owner_func| if (!zcu.intern_pool.funcAnalysisUnordered(owner_func).calls_or_awaits_errorable_fn) { - // No errorable fn actually called; we have no error return trace - input_is_error = false; - }, - } - if (block.ownerModule().error_tracing and !block.isComptime() and !block.is_typeof and (input_is_error or pop_error_return_trace)) { @@ -7872,6 +7864,12 @@ fn analyzeCall( } break :msg msg; }); + if (func_ty_info.cc == .auto) { + switch (sema.owner.unwrap()) { + .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {}, + .func => |owner_func| ip.funcSetHasErrorTrace(owner_func, true), + } + } for (args, 0..) |arg, arg_idx| { try sema.validateRuntimeValue(block, args_info.argSrc(block, arg_idx), arg); } @@ -7946,13 +7944,6 @@ fn analyzeCall( try zcu.ensureFuncBodyAnalysisQueued(runtime_func_val.toIntern()); } - switch (sema.owner.unwrap()) { - .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {}, - .func => |owner_func| if (resolved_ret_ty.isError(zcu)) { - ip.funcSetCallsOrAwaitsErrorableFn(owner_func); - }, - } - const call_tag: Air.Inst.Tag = switch (modifier) { .auto, .no_async => .call, .never_tail => .call_never_tail, @@ -19706,16 +19697,16 @@ fn retWithErrTracing( .bool_false => false, else => true, }; + + // This means we're returning something that might be an error! + // This should only be possible with the `auto` cc, so we definitely have an error trace. + assert(pt.zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).has_error_trace); + const gpa = sema.gpa; - const stack_trace_ty = try sema.getBuiltinType(src, .StackTrace); - try stack_trace_ty.resolveFields(pt); - const ptr_stack_trace_ty = try pt.singleMutPtrType(stack_trace_ty); - const err_return_trace = try block.addTy(.err_return_trace, ptr_stack_trace_ty); const return_err_fn = Air.internedToRef(try sema.getBuiltin(src, .returnError)); - const args: [1]Air.Inst.Ref = .{err_return_trace}; if (!need_check) { - try sema.callBuiltin(block, src, return_err_fn, .never_inline, &args, .@"error return"); + try sema.callBuiltin(block, src, return_err_fn, .never_inline, &.{}, .@"error return"); _ = try block.addUnOp(ret_tag, operand); return; } @@ -19726,7 +19717,7 @@ fn retWithErrTracing( var else_block = block.makeSubBlock(); defer else_block.instructions.deinit(gpa); - try sema.callBuiltin(&else_block, src, return_err_fn, .never_inline, &args, .@"error return"); + try sema.callBuiltin(&else_block, src, return_err_fn, .never_inline, &.{}, .@"error return"); _ = try else_block.addUnOp(ret_tag, operand); try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).@"struct".fields.len + @@ -19837,7 +19828,7 @@ fn restoreErrRetIndex(sema: *Sema, start_block: *Block, src: LazySrcLoc, target_ return; } - if (!zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).calls_or_awaits_errorable_fn) return; + if (!zcu.intern_pool.funcAnalysisUnordered(sema.owner.unwrap().func).has_error_trace) return; if (!start_block.ownerModule().error_tracing) return; assert(saved_index != .none); // The .error_return_trace_index field was dropped somewhere @@ -21123,7 +21114,7 @@ fn getErrorReturnTrace(sema: *Sema, block: *Block) CompileError!Air.Inst.Ref { const opt_ptr_stack_trace_ty = try pt.optionalType(ptr_stack_trace_ty.toIntern()); switch (sema.owner.unwrap()) { - .func => |func| if (ip.funcAnalysisUnordered(func).calls_or_awaits_errorable_fn and block.ownerModule().error_tracing) { + .func => |func| if (ip.funcAnalysisUnordered(func).has_error_trace and block.ownerModule().error_tracing) { return block.addTy(.err_return_trace, opt_ptr_stack_trace_ty); }, .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {}, @@ -27096,6 +27087,10 @@ fn preparePanicId(sema: *Sema, src: LazySrcLoc, panic_id: Zcu.PanicId) !InternPo const zcu = sema.pt.zcu; try sema.ensureMemoizedStateResolved(src, .panic); try zcu.ensureFuncBodyAnalysisQueued(zcu.builtin_decl_values.get(.@"Panic.call")); + switch (sema.owner.unwrap()) { + .@"comptime", .nav_ty, .nav_val, .type, .memoized_state => {}, + .func => |owner_func| zcu.intern_pool.funcSetHasErrorTrace(owner_func, true), + } return zcu.builtin_decl_values.get(panic_id.toBuiltin()); } |
