diff --git a/lib/test_runner.zig b/lib/test_runner.zig index 4b6c80ac6604ce241d56db110e178176216d1c04..5ae05464f2fa4c44a66ed7c3617e6363c5d7985e 100644 --- a/lib/test_runner.zig +++ b/lib/test_runner.zig @@ -92,9 +92,9 @@ pub fn main() void { fail_count += 1; progress.log("FAIL ({s})\n", .{@errorName(err)}); if (!have_tty) std.debug.print("FAIL ({s})\n", .{@errorName(err)}); - if (builtin.zig_backend != .stage2_llvm) if (@errorReturnTrace()) |trace| { + if (@errorReturnTrace()) |trace| { std.debug.dumpStackTrace(trace.*); - }; + } test_node.end(); }, } diff --git a/src/Sema.zig b/src/Sema.zig index ab2a59f44a09812d2258567727878b360022e7ef..18018060840a5ad4975f50792c514a7526ca9bb6 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1412,6 +1412,12 @@ fn analyzeAsType( } pub fn setupErrorReturnTrace(sema: *Sema, block: *Block, last_arg_index: usize) !void { + const backend_supports_error_return_tracing = false; + if (!backend_supports_error_return_tracing) { + // TODO implement this feature in all the backends and then delete this branch + return; + } + var err_trace_block = block.makeSubBlock(); err_trace_block.is_comptime = false; defer err_trace_block.instructions.deinit(sema.gpa); @@ -12655,7 +12661,12 @@ fn analyzeRet( return always_noreturn; } - if (sema.fn_ret_ty.isError() and sema.mod.comp.bin_file.options.error_return_tracing) { + // TODO implement this feature in all the backends and then delete this check. + const backend_supports_error_return_tracing = false; + + if (sema.fn_ret_ty.isError() and sema.mod.comp.bin_file.options.error_return_tracing and + backend_supports_error_return_tracing) + { const return_err_fn = try sema.getBuiltin(block, src, "returnError"); const unresolved_stack_trace_ty = try sema.getBuiltinType(block, src, "StackTrace"); const stack_trace_ty = try sema.resolveTypeFields(block, src, unresolved_stack_trace_ty); @@ -13397,9 +13408,14 @@ fn zirErrorReturnTrace( const unresolved_stack_trace_ty = try sema.getBuiltinType(block, src, "StackTrace"); const stack_trace_ty = try sema.resolveTypeFields(block, src, unresolved_stack_trace_ty); const opt_ptr_stack_trace_ty = try Type.Tag.optional_single_mut_pointer.create(sema.arena, stack_trace_ty); + + // TODO implement this feature in all the backends and then delete this check. + const backend_supports_error_return_tracing = false; + if (sema.owner_func != null and sema.owner_func.?.calls_or_awaits_errorable_fn and - sema.mod.comp.bin_file.options.error_return_tracing) + sema.mod.comp.bin_file.options.error_return_tracing and + backend_supports_error_return_tracing) { return block.addTy(.err_return_trace, opt_ptr_stack_trace_ty); } diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index 56b7b874999c451b069d7c99e7032802fb620850..95a29b840ed8ab99cc240ba803b5356ebd2bda3f 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -2333,21 +2333,17 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void { } fn airErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; + _ = inst; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + return self.finishAir(inst, result, .{ .none, .none, .none }); } fn airSetErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + _ = inst; + return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); } fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void { diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig index f09b37ee69767dcb7bbbcf1667c1f8e9502b736b..0154548911c86fc39812c7902bdf0c72d05b88f5 100644 --- a/src/arch/arm/CodeGen.zig +++ b/src/arch/arm/CodeGen.zig @@ -1846,21 +1846,17 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void { } fn airErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; + _ = inst; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + return self.finishAir(inst, result, .{ .none, .none, .none }); } fn airSetErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + _ = inst; + return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); } /// T to E!T diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index 6d813cfbbba5e50fdee33a8d98211d880e7aa1ca..22c97b9aec2a8c6a63f443d52432c14af40e0c84 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -1270,21 +1270,17 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void { } fn airErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; + _ = inst; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + return self.finishAir(inst, result, .{ .none, .none, .none }); } fn airSetErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + _ = inst; + return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); } fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void { diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 31ecc58c66d617187a7c8aff38f80dbc848b7b3b..bb3ebec5db5f7ba630c7175df3a16e902dce727e 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -1858,21 +1858,17 @@ fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void { } fn airErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; + _ = inst; const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + return self.finishAir(inst, result, .{ .none, .none, .none }); } fn airSetErrReturnTrace(self: *Self, inst: Air.Inst.Index) !void { - const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); + _ = inst; + return self.fail("TODO implement airSetErrReturnTrace for {}", .{self.target.cpu.arch}); } fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void { diff --git a/src/codegen/c.zig b/src/codegen/c.zig index c3ca79dabe8d3618e7a148f7cad572d6a231927e..92770168f49f13848c78e844f064fe4595beb804 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -3451,33 +3451,11 @@ fn airErrUnionPayloadPtrSet(f: *Function, inst: Air.Inst.Index) !CValue { fn airErrReturnTrace(f: *Function, inst: Air.Inst.Index) !CValue { if (f.liveness.isUnused(inst)) return CValue.none; - - const un_op = f.air.instructions.items(.data)[inst].un_op; - const writer = f.object.writer(); - const inst_ty = f.air.typeOfIndex(inst); - const operand = try f.resolveInst(un_op); - const local = try f.allocLocal(inst_ty, .Const); - - try writer.writeAll(" = "); - - _ = operand; - _ = local; return f.fail("TODO: C backend: implement airErrReturnTrace", .{}); } fn airSetErrReturnTrace(f: *Function, inst: Air.Inst.Index) !CValue { - if (f.liveness.isUnused(inst)) return CValue.none; - - const un_op = f.air.instructions.items(.data)[inst].un_op; - const writer = f.object.writer(); - const inst_ty = f.air.typeOfIndex(inst); - const operand = try f.resolveInst(un_op); - const local = try f.allocLocal(inst_ty, .Const); - - try writer.writeAll(" = "); - - _ = operand; - _ = local; + _ = inst; return f.fail("TODO: C backend: implement airSetErrReturnTrace", .{}); } diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index dfb0f8f03bc4377d4f714d34d8ba1cc3c59d7428..f6bb989f37ad736411905d66339244d8da08605a 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -637,7 +637,7 @@ pub const Object = struct { const gpa = dg.gpa; const err_return_tracing = fn_info.return_type.isError() and - dg.module.comp.bin_file.options.error_return_tracing; + dg.module.comp.bin_file.options.error_return_tracing and false; const err_ret_trace = if (err_return_tracing) llvm_func.getParam(@boolToInt(ret_ptr != null)) @@ -1765,7 +1765,7 @@ pub const Object = struct { } if (fn_info.return_type.isError() and - o.module.comp.bin_file.options.error_return_tracing) + o.module.comp.bin_file.options.error_return_tracing and false) { var ptr_ty_payload: Type.Payload.ElemType = .{ .base = .{ .tag = .single_mut_pointer }, @@ -2018,7 +2018,7 @@ pub const DeclGen = struct { } const err_return_tracing = fn_info.return_type.isError() and - dg.module.comp.bin_file.options.error_return_tracing; + dg.module.comp.bin_file.options.error_return_tracing and false; if (err_return_tracing) { dg.addArgAttr(llvm_fn, @boolToInt(sret), "nonnull"); @@ -2484,7 +2484,7 @@ pub const DeclGen = struct { } if (fn_info.return_type.isError() and - dg.module.comp.bin_file.options.error_return_tracing) + dg.module.comp.bin_file.options.error_return_tracing and false) { var ptr_ty_payload: Type.Payload.ElemType = .{ .base = .{ .tag = .single_mut_pointer }, @@ -3796,7 +3796,7 @@ pub const FuncGen = struct { }; if (fn_info.return_type.isError() and - self.dg.module.comp.bin_file.options.error_return_tracing) + self.dg.module.comp.bin_file.options.error_return_tracing and false) { try llvm_args.append(self.err_ret_trace.?); }