aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorMatthew Lugg <mlugg@mlugg.co.uk>2025-01-22 16:48:27 +0000
committerGitHub <noreply@github.com>2025-01-22 16:48:27 +0000
commit0e815c652d7908be62612bb931c2ee9698dd41da (patch)
tree2fdefb0b7575805af532ed4fb60057d1cb3dc206 /src/Sema.zig
parent61fe307d0f05eea901577900f4ab2bdaf0ffb35f (diff)
parentd4b6a53327352dc239644dab0ec2abbe3a1b1be9 (diff)
downloadzig-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.zig43
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());
}