authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-10 11:38:04+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-11 12:23:57+03:00
log73f283e3e2326c5c8a7f5b87de5c7eed7b7ea099
tree53f1b710c5f558f3b46bb6ee012a9158767450b1
parent0a7f8c2e013f24aa6c94093400fe6377ab74b4e1

Sema: fix nested call debug info

Closes #15631

1 files changed, 24 insertions(+), 13 deletions(-)

src/Sema.zig+24-13
......@@ -6387,14 +6387,18 @@ fn zirCall(
63876387 }
63886388 resolved_args[arg_index] = resolved;
63896389 }
6390 if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn)
6390 if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) {
63916391 input_is_error = false; // input was an error type, but no errorable fn's were actually called
6392 }
6393
6394 // AstGen ensures that a call instruction is always preceded by a dbg_stmt instruction.
6395 const call_dbg_node = inst - 1;
63926396
63936397 if (sema.mod.backendSupportsFeature(.error_return_trace) and sema.mod.comp.bin_file.options.error_return_tracing and
63946398 !block.is_comptime and !block.is_typeof and (input_is_error or pop_error_return_trace))
63956399 {
63966400 const call_inst: Air.Inst.Ref = if (modifier == .always_tail) undefined else b: {
6397 break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
6401 break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
63986402 };
63996403
64006404 const return_ty = sema.typeOf(call_inst);
......@@ -6423,11 +6427,11 @@ fn zirCall(
64236427 }
64246428
64256429 if (modifier == .always_tail) // Perform the call *after* the restore, so that a tail call is possible.
6426 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
6430 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
64276431
64286432 return call_inst;
64296433 } else {
6430 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
6434 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node);
64316435 }
64326436}
64336437
......@@ -6511,6 +6515,7 @@ fn analyzeCall(
65116515 ensure_result_used: bool,
65126516 uncasted_args: []const Air.Inst.Ref,
65136517 bound_arg_src: ?LazySrcLoc,
6518 call_dbg_node: ?Zir.Inst.Index,
65146519) CompileError!Air.Inst.Ref {
65156520 const mod = sema.mod;
65166521
......@@ -6628,6 +6633,7 @@ fn analyzeCall(
66286633 uncasted_args,
66296634 call_tag,
66306635 bound_arg_src,
6636 call_dbg_node,
66316637 )) |some| {
66326638 return some;
66336639 } else |err| switch (err) {
......@@ -7016,6 +7022,8 @@ fn analyzeCall(
70167022 }
70177023 }
70187024
7025 if (call_dbg_node) |some| try sema.zirDbgStmt(block, some);
7026
70197027 try sema.queueFullTypeResolution(func_ty_info.return_type);
70207028 if (sema.owner_func != null and func_ty_info.return_type.isError()) {
70217029 sema.owner_func.?.calls_or_awaits_errorable_fn = true;
......@@ -7252,6 +7260,7 @@ fn instantiateGenericCall(
72527260 uncasted_args: []const Air.Inst.Ref,
72537261 call_tag: Air.Inst.Tag,
72547262 bound_arg_src: ?LazySrcLoc,
7263 call_dbg_node: ?Zir.Inst.Index,
72557264) CompileError!Air.Inst.Ref {
72567265 const mod = sema.mod;
72577266 const gpa = sema.gpa;
......@@ -7508,6 +7517,8 @@ fn instantiateGenericCall(
75087517 try sema.queueFullTypeResolution(new_fn_info.return_type);
75097518 }
75107519
7520 if (call_dbg_node) |some| try sema.zirDbgStmt(block, some);
7521
75117522 if (sema.owner_func != null and new_fn_info.return_type.isError()) {
75127523 sema.owner_func.?.calls_or_awaits_errorable_fn = true;
75137524 }
......@@ -11822,7 +11833,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op
1182211833 const panic_fn = try sema.getBuiltin("panicUnwrapError");
1182311834 const err_return_trace = try sema.getErrorReturnTrace(block);
1182411835 const args: [2]Air.Inst.Ref = .{ err_return_trace, operand };
11825 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
11836 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
1182611837 return true;
1182711838 },
1182811839 .panic => {
......@@ -11833,7 +11844,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op
1183311844 const panic_fn = try sema.getBuiltin("panic");
1183411845 const err_return_trace = try sema.getErrorReturnTrace(block);
1183511846 const args: [3]Air.Inst.Ref = .{ msg_inst, err_return_trace, .null_value };
11836 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
11847 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
1183711848 return true;
1183811849 },
1183911850 else => unreachable,
......@@ -17279,7 +17290,7 @@ fn retWithErrTracing(
1727917290 const args: [1]Air.Inst.Ref = .{err_return_trace};
1728017291
1728117292 if (!need_check) {
17282 _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null);
17293 _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null, null);
1728317294 _ = try block.addUnOp(ret_tag, operand);
1728417295 return always_noreturn;
1728517296 }
......@@ -17290,7 +17301,7 @@ fn retWithErrTracing(
1729017301
1729117302 var else_block = block.makeSubBlock();
1729217303 defer else_block.instructions.deinit(gpa);
17293 _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null);
17304 _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null, null);
1729417305 _ = try else_block.addUnOp(ret_tag, operand);
1729517306
1729617307 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).Struct.fields.len +
......@@ -21647,7 +21658,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
2164721658 }
2164821659 }
2164921660 const ensure_result_used = extra.flags.ensure_result_used;
21650 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
21661 return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, null);
2165121662}
2165221663
2165321664fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -23481,7 +23492,7 @@ fn panicWithMsg(
2348123492 Value.null,
2348223493 );
2348323494 const args: [3]Air.Inst.Ref = .{ msg_inst, null_stack_trace, .null_value };
23484 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null);
23495 _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null);
2348523496}
2348623497
2348723498fn panicUnwrapError(
......@@ -23519,7 +23530,7 @@ fn panicUnwrapError(
2351923530 const err = try fail_block.addTyOp(unwrap_err_tag, Type.anyerror, operand);
2352023531 const err_return_trace = try sema.getErrorReturnTrace(&fail_block);
2352123532 const args: [2]Air.Inst.Ref = .{ err_return_trace, err };
23522 _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null);
23533 _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null);
2352323534 }
2352423535 }
2352523536 try sema.addSafetyCheckExtra(parent_block, ok, &fail_block);
......@@ -23604,7 +23615,7 @@ fn panicSentinelMismatch(
2360423615 else {
2360523616 const panic_fn = try sema.getBuiltin("checkNonScalarSentinel");
2360623617 const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel };
23607 _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null);
23618 _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null);
2360823619 return;
2360923620 };
2361023621
......@@ -23641,7 +23652,7 @@ fn safetyCheckFormatted(
2364123652 _ = try fail_block.addNoOp(.trap);
2364223653 } else {
2364323654 const panic_fn = try sema.getBuiltin(func);
23644 _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null);
23655 _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null, null);
2364523656 }
2364623657 try sema.addSafetyCheckExtra(parent_block, ok, &fail_block);
2364723658}