| ... | ... | @@ -5664,6 +5664,7 @@ fn zirCall( |
| 5664 | 5664 | |
| 5665 | 5665 | const modifier = @intToEnum(std.builtin.CallOptions.Modifier, extra.data.flags.packed_modifier); |
| 5666 | 5666 | const ensure_result_used = extra.data.flags.ensure_result_used; |
| 5667 | const pop_error_return_trace = extra.data.flags.pop_error_return_trace; |
| 5667 | 5668 | |
| 5668 | 5669 | var func = try sema.resolveInst(extra.data.callee); |
| 5669 | 5670 | var resolved_args: []Air.Inst.Ref = undefined; |
| ... | ... | @@ -5771,7 +5772,7 @@ fn zirCall( |
| 5771 | 5772 | resolved_args[arg_index] = resolved; |
| 5772 | 5773 | } |
| 5773 | 5774 | |
| 5774 | | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 5775 | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, pop_error_return_trace, resolved_args, bound_arg_src); |
| 5775 | 5776 | } |
| 5776 | 5777 | |
| 5777 | 5778 | const GenericCallAdapter = struct { |
| ... | ... | @@ -5883,6 +5884,7 @@ fn analyzeCall( |
| 5883 | 5884 | call_src: LazySrcLoc, |
| 5884 | 5885 | modifier: std.builtin.CallOptions.Modifier, |
| 5885 | 5886 | ensure_result_used: bool, |
| 5887 | pop_error_return_trace: bool, |
| 5886 | 5888 | uncasted_args: []const Air.Inst.Ref, |
| 5887 | 5889 | bound_arg_src: ?LazySrcLoc, |
| 5888 | 5890 | ) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -6333,19 +6335,55 @@ fn analyzeCall( |
| 6333 | 6335 | sema.owner_func.?.calls_or_awaits_errorable_fn = true; |
| 6334 | 6336 | } |
| 6335 | 6337 | |
| 6336 | | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Call).Struct.fields.len + |
| 6337 | | args.len); |
| 6338 | | const func_inst = try block.addInst(.{ |
| 6339 | | .tag = call_tag, |
| 6340 | | .data = .{ .pl_op = .{ |
| 6341 | | .operand = func, |
| 6342 | | .payload = sema.addExtraAssumeCapacity(Air.Call{ |
| 6343 | | .args_len = @intCast(u32, args.len), |
| 6344 | | }), |
| 6345 | | } }, |
| 6346 | | }); |
| 6347 | | sema.appendRefsAssumeCapacity(args); |
| 6348 | | break :res func_inst; |
| 6338 | const backend_supports_error_return_tracing = sema.mod.comp.bin_file.options.use_llvm; |
| 6339 | const emit_error_trace_save_restore = sema.mod.comp.bin_file.options.error_return_tracing and |
| 6340 | backend_supports_error_return_tracing and |
| 6341 | pop_error_return_trace and func_ty_info.return_type.isError(); |
| 6342 | |
| 6343 | if (emit_error_trace_save_restore) { |
| 6344 | // This function call is error-able (and so can generate an error trace), but AstGen determined |
| 6345 | // that its result does not go to an error-handling operator (try/catch/return etc.). We need to |
| 6346 | // save and restore the error trace index here, effectively "popping" the new entries immediately. |
| 6347 | |
| 6348 | const unresolved_stack_trace_ty = try sema.getBuiltinType(block, call_src, "StackTrace"); |
| 6349 | const stack_trace_ty = try sema.resolveTypeFields(block, call_src, unresolved_stack_trace_ty); |
| 6350 | const ptr_stack_trace_ty = try Type.Tag.single_mut_pointer.create(sema.arena, stack_trace_ty); |
| 6351 | const err_return_trace = try block.addTy(.err_return_trace, ptr_stack_trace_ty); |
| 6352 | const field_ptr = try sema.structFieldPtr(block, call_src, err_return_trace, "index", call_src, stack_trace_ty, true); |
| 6353 | |
| 6354 | const saved_index = try sema.analyzeLoad(block, call_src, field_ptr, call_src); |
| 6355 | |
| 6356 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Call).Struct.fields.len + |
| 6357 | args.len); |
| 6358 | const func_inst = try block.addInst(.{ |
| 6359 | .tag = call_tag, |
| 6360 | .data = .{ .pl_op = .{ |
| 6361 | .operand = func, |
| 6362 | .payload = sema.addExtraAssumeCapacity(Air.Call{ |
| 6363 | .args_len = @intCast(u32, args.len), |
| 6364 | }), |
| 6365 | } }, |
| 6366 | }); |
| 6367 | sema.appendRefsAssumeCapacity(args); |
| 6368 | |
| 6369 | try sema.storePtr2(block, call_src, field_ptr, call_src, saved_index, call_src, .store); |
| 6370 | |
| 6371 | break :res func_inst; |
| 6372 | } else { |
| 6373 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Call).Struct.fields.len + |
| 6374 | args.len); |
| 6375 | const func_inst = try block.addInst(.{ |
| 6376 | .tag = call_tag, |
| 6377 | .data = .{ .pl_op = .{ |
| 6378 | .operand = func, |
| 6379 | .payload = sema.addExtraAssumeCapacity(Air.Call{ |
| 6380 | .args_len = @intCast(u32, args.len), |
| 6381 | }), |
| 6382 | } }, |
| 6383 | }); |
| 6384 | sema.appendRefsAssumeCapacity(args); |
| 6385 | break :res func_inst; |
| 6386 | } |
| 6349 | 6387 | }; |
| 6350 | 6388 | |
| 6351 | 6389 | if (ensure_result_used) { |
| ... | ... | @@ -10927,7 +10965,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op |
| 10927 | 10965 | const panic_fn = try sema.getBuiltin(block, src, "panicUnwrapError"); |
| 10928 | 10966 | const err_return_trace = try sema.getErrorReturnTrace(block, src); |
| 10929 | 10967 | const args: [2]Air.Inst.Ref = .{ err_return_trace, operand }; |
| 10930 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 10968 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, false, &args, null); |
| 10931 | 10969 | return true; |
| 10932 | 10970 | }, |
| 10933 | 10971 | .panic => { |
| ... | ... | @@ -10938,7 +10976,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op |
| 10938 | 10976 | const panic_fn = try sema.getBuiltin(block, src, "panic"); |
| 10939 | 10977 | const err_return_trace = try sema.getErrorReturnTrace(block, src); |
| 10940 | 10978 | const args: [3]Air.Inst.Ref = .{ msg_inst, err_return_trace, .null_value }; |
| 10941 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 10979 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, false, &args, null); |
| 10942 | 10980 | return true; |
| 10943 | 10981 | }, |
| 10944 | 10982 | else => unreachable, |
| ... | ... | @@ -16141,7 +16179,7 @@ fn retWithErrTracing( |
| 16141 | 16179 | const args: [1]Air.Inst.Ref = .{err_return_trace}; |
| 16142 | 16180 | |
| 16143 | 16181 | if (!need_check) { |
| 16144 | | _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null); |
| 16182 | _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, false, &args, null); |
| 16145 | 16183 | _ = try block.addUnOp(ret_tag, operand); |
| 16146 | 16184 | return always_noreturn; |
| 16147 | 16185 | } |
| ... | ... | @@ -16152,7 +16190,7 @@ fn retWithErrTracing( |
| 16152 | 16190 | |
| 16153 | 16191 | var else_block = block.makeSubBlock(); |
| 16154 | 16192 | defer else_block.instructions.deinit(gpa); |
| 16155 | | _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null); |
| 16193 | _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, false, &args, null); |
| 16156 | 16194 | _ = try else_block.addUnOp(ret_tag, operand); |
| 16157 | 16195 | |
| 16158 | 16196 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).Struct.fields.len + |
| ... | ... | @@ -20369,7 +20407,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 20369 | 20407 | } |
| 20370 | 20408 | } |
| 20371 | 20409 | const ensure_result_used = extra.flags.ensure_result_used; |
| 20372 | | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 20410 | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, false, resolved_args, bound_arg_src); |
| 20373 | 20411 | } |
| 20374 | 20412 | |
| 20375 | 20413 | fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -21803,7 +21841,7 @@ fn panicWithMsg( |
| 21803 | 21841 | Value.@"null", |
| 21804 | 21842 | ); |
| 21805 | 21843 | const args: [3]Air.Inst.Ref = .{ msg_inst, null_stack_trace, .null_value }; |
| 21806 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 21844 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, false, &args, null); |
| 21807 | 21845 | return always_noreturn; |
| 21808 | 21846 | } |
| 21809 | 21847 | |
| ... | ... | @@ -21844,7 +21882,7 @@ fn panicUnwrapError( |
| 21844 | 21882 | const err = try fail_block.addTyOp(unwrap_err_tag, Type.anyerror, operand); |
| 21845 | 21883 | const err_return_trace = try sema.getErrorReturnTrace(&fail_block, src); |
| 21846 | 21884 | const args: [2]Air.Inst.Ref = .{ err_return_trace, err }; |
| 21847 | | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, &args, null); |
| 21885 | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, false, &args, null); |
| 21848 | 21886 | } |
| 21849 | 21887 | } |
| 21850 | 21888 | try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); |
| ... | ... | @@ -21885,7 +21923,7 @@ fn panicIndexOutOfBounds( |
| 21885 | 21923 | } else { |
| 21886 | 21924 | const panic_fn = try sema.getBuiltin(&fail_block, src, "panicOutOfBounds"); |
| 21887 | 21925 | const args: [2]Air.Inst.Ref = .{ index, len }; |
| 21888 | | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, &args, null); |
| 21926 | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, false, &args, null); |
| 21889 | 21927 | } |
| 21890 | 21928 | } |
| 21891 | 21929 | try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); |
| ... | ... | @@ -21927,7 +21965,7 @@ fn panicSentinelMismatch( |
| 21927 | 21965 | else { |
| 21928 | 21966 | const panic_fn = try sema.getBuiltin(parent_block, src, "checkNonScalarSentinel"); |
| 21929 | 21967 | const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel }; |
| 21930 | | _ = try sema.analyzeCall(parent_block, panic_fn, src, src, .auto, false, &args, null); |
| 21968 | _ = try sema.analyzeCall(parent_block, panic_fn, src, src, .auto, false, false, &args, null); |
| 21931 | 21969 | return; |
| 21932 | 21970 | }; |
| 21933 | 21971 | const gpa = sema.gpa; |
| ... | ... | @@ -21956,7 +21994,7 @@ fn panicSentinelMismatch( |
| 21956 | 21994 | } else { |
| 21957 | 21995 | const panic_fn = try sema.getBuiltin(&fail_block, src, "panicSentinelMismatch"); |
| 21958 | 21996 | const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel }; |
| 21959 | | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, &args, null); |
| 21997 | _ = try sema.analyzeCall(&fail_block, panic_fn, src, src, .auto, false, false, &args, null); |
| 21960 | 21998 | } |
| 21961 | 21999 | } |
| 21962 | 22000 | try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); |