authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-01-02 17:03:21+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-02 15:15:59-05:00
logc710d5eefe3f83226f1651947239730e77af43cb
tree0cbae154410b4def95af396c78a6c2dbbd91b0eb
parent36b069910ef71278ad3aaf059f12144d8b86e856

stage2 ARM: implement wrap_errunion_err for empty payloads


3 files changed, 31 insertions(+), 10 deletions(-)

src/arch/arm/CodeGen.zig+8-1
...@@ -1160,7 +1160,14 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void {...@@ -1160,7 +1160,14 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void {
1160/// E to E!T1160/// E to E!T
1161fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void {1161fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void {
1162 const ty_op = self.air.instructions.items(.data)[inst].ty_op;1162 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1163 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement wrap errunion error for {}", .{self.target.cpu.arch});1163 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
1164 const error_union_ty = self.air.getRefType(ty_op.ty);
1165 const payload_ty = error_union_ty.errorUnionPayload();
1166 const mcv = try self.resolveInst(ty_op.operand);
1167 if (!payload_ty.hasCodeGenBits()) break :result mcv;
1168
1169 return self.fail("TODO implement wrap errunion error for non-empty payloads", .{});
1170 };
1164 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });1171 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1165}1172}
11661173
test/behavior.zig+9-9
...@@ -2,10 +2,19 @@ const builtin = @import("builtin");...@@ -2,10 +2,19 @@ const builtin = @import("builtin");
22
3test {3test {
4 // Tests that pass for stage1, llvm backend, C backend, wasm backend, and arm backend.4 // Tests that pass for stage1, llvm backend, C backend, wasm backend, and arm backend.
5 _ = @import("behavior/bugs/679.zig");
5 _ = @import("behavior/bugs/1111.zig");6 _ = @import("behavior/bugs/1111.zig");
6 _ = @import("behavior/bugs/2346.zig");7 _ = @import("behavior/bugs/2346.zig");
7 _ = @import("behavior/bugs/3586.zig");8 _ = @import("behavior/bugs/3586.zig");
9 _ = @import("behavior/bugs/4560.zig");
10 _ = @import("behavior/bugs/6850.zig");
8 _ = @import("behavior/slice_sentinel_comptime.zig");11 _ = @import("behavior/slice_sentinel_comptime.zig");
12 _ = @import("behavior/fn_in_struct_in_comptime.zig");
13 _ = @import("behavior/hasfield.zig");
14 _ = @import("behavior/hasdecl.zig");
15 _ = @import("behavior/pub_enum.zig");
16 _ = @import("behavior/type_info.zig");
17 _ = @import("behavior/type.zig");
918
10 if (!builtin.zig_is_stage2 or builtin.stage2_arch != .arm) {19 if (!builtin.zig_is_stage2 or builtin.stage2_arch != .arm) {
11 // Tests that pass for stage1, llvm backend, C backend, wasm backend.20 // Tests that pass for stage1, llvm backend, C backend, wasm backend.
...@@ -14,36 +23,27 @@ test {...@@ -14,36 +23,27 @@ test {
14 _ = @import("behavior/bool.zig");23 _ = @import("behavior/bool.zig");
15 _ = @import("behavior/bugs/624.zig");24 _ = @import("behavior/bugs/624.zig");
16 _ = @import("behavior/bugs/655.zig");25 _ = @import("behavior/bugs/655.zig");
17 _ = @import("behavior/bugs/679.zig");
18 _ = @import("behavior/bugs/704.zig");26 _ = @import("behavior/bugs/704.zig");
19 _ = @import("behavior/bugs/1486.zig");27 _ = @import("behavior/bugs/1486.zig");
20 _ = @import("behavior/bugs/2692.zig");28 _ = @import("behavior/bugs/2692.zig");
21 _ = @import("behavior/bugs/2889.zig");29 _ = @import("behavior/bugs/2889.zig");
22 _ = @import("behavior/bugs/3046.zig");30 _ = @import("behavior/bugs/3046.zig");
23 _ = @import("behavior/bugs/4560.zig");
24 _ = @import("behavior/bugs/4769_a.zig");31 _ = @import("behavior/bugs/4769_a.zig");
25 _ = @import("behavior/bugs/4769_b.zig");32 _ = @import("behavior/bugs/4769_b.zig");
26 _ = @import("behavior/bugs/4954.zig");33 _ = @import("behavior/bugs/4954.zig");
27 _ = @import("behavior/bugs/6850.zig");
28 _ = @import("behavior/byval_arg_var.zig");34 _ = @import("behavior/byval_arg_var.zig");
29 _ = @import("behavior/call.zig");35 _ = @import("behavior/call.zig");
30 _ = @import("behavior/defer.zig");36 _ = @import("behavior/defer.zig");
31 _ = @import("behavior/enum.zig");37 _ = @import("behavior/enum.zig");
32 _ = @import("behavior/error.zig");38 _ = @import("behavior/error.zig");
33 _ = @import("behavior/fn_in_struct_in_comptime.zig");
34 _ = @import("behavior/hasdecl.zig");
35 _ = @import("behavior/hasfield.zig");
36 _ = @import("behavior/if.zig");39 _ = @import("behavior/if.zig");
37 _ = @import("behavior/import.zig");40 _ = @import("behavior/import.zig");
38 _ = @import("behavior/incomplete_struct_param_tld.zig");41 _ = @import("behavior/incomplete_struct_param_tld.zig");
39 _ = @import("behavior/inttoptr.zig");42 _ = @import("behavior/inttoptr.zig");
40 _ = @import("behavior/pointers.zig");43 _ = @import("behavior/pointers.zig");
41 _ = @import("behavior/ptrcast.zig");44 _ = @import("behavior/ptrcast.zig");
42 _ = @import("behavior/pub_enum.zig");
43 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");45 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
44 _ = @import("behavior/truncate.zig");46 _ = @import("behavior/truncate.zig");
45 _ = @import("behavior/type_info.zig");
46 _ = @import("behavior/type.zig");
47 _ = @import("behavior/usingnamespace.zig");47 _ = @import("behavior/usingnamespace.zig");
48 _ = @import("behavior/underscore.zig");48 _ = @import("behavior/underscore.zig");
4949
test/stage2/arm.zig+14
...@@ -665,6 +665,20 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -665,6 +665,20 @@ pub fn addCases(ctx: *TestContext) !void {
665 ,665 ,
666 "",666 "",
667 );667 );
668
669 case.addCompareOutput(
670 \\pub fn main() void {
671 \\ foo() catch unreachable;
672 \\}
673 \\
674 \\fn foo() anyerror!void {
675 \\ try bar();
676 \\}
677 \\
678 \\fn bar() anyerror!void {}
679 ,
680 "",
681 );
668 }682 }
669683
670 {684 {