| author | |
| committer | |
| log | 12cdb36c5ba1fd9dfa5985d36a2f5955528c2de7 |
| tree | b28b98a8c43ad1a81eeac26e2a07d7acbb38ebf9 |
| parent | 05431d7c4a8cb20a3a70553ef0d0f8ed00a05402 |
* do not track `rdi` register before `call` inst, but instead freeze
it from further use, until `call` has been realised
* pass more error union tests3 files changed, 21 insertions(+), 33 deletions(-)
src/arch/x86_64/CodeGen.zig+3-1| ... | ... | @@ -3167,11 +3167,13 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 3167 | 3167 | const ret_abi_align = @intCast(u32, ret_ty.abiAlignment(self.target.*)); |
| 3168 | 3168 | const stack_offset = @intCast(i32, try self.allocMem(inst, ret_abi_size, ret_abi_align)); |
| 3169 | 3169 | |
| 3170 | try self.register_manager.getReg(.rdi, inst); | |
| 3170 | try self.register_manager.getReg(.rdi, null); | |
| 3171 | self.register_manager.freezeRegs(&.{.rdi}); | |
| 3171 | 3172 | try self.genSetReg(Type.usize, .rdi, .{ .ptr_stack_offset = stack_offset }); |
| 3172 | 3173 | |
| 3173 | 3174 | info.return_value.stack_offset = stack_offset; |
| 3174 | 3175 | } |
| 3176 | defer if (info.return_value == .stack_offset) self.register_manager.unfreezeRegs(&.{.rdi}); | |
| 3175 | 3177 | |
| 3176 | 3178 | for (args) |arg, arg_i| { |
| 3177 | 3179 | const mc_arg = info.args[arg_i]; |
src/codegen.zig+18-27| ... | ... | @@ -553,31 +553,21 @@ pub fn generateSymbol( |
| 553 | 553 | const target = bin_file.options.target; |
| 554 | 554 | const abi_align = typed_value.ty.abiAlignment(target); |
| 555 | 555 | |
| 556 | { | |
| 557 | const error_val = if (!is_payload) typed_value.val else Value.initTag(.zero); | |
| 558 | const begin = code.items.len; | |
| 559 | switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ | |
| 560 | .ty = error_ty, | |
| 561 | .val = error_val, | |
| 562 | }, code, debug_output)) { | |
| 563 | .appended => {}, | |
| 564 | .externally_managed => |external_slice| { | |
| 565 | code.appendSliceAssumeCapacity(external_slice); | |
| 566 | }, | |
| 567 | .fail => |em| return Result{ .fail = em }, | |
| 568 | } | |
| 569 | const unpadded_end = code.items.len - begin; | |
| 570 | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); | |
| 571 | const padding = try math.cast(usize, padded_end - unpadded_end); | |
| 572 | ||
| 573 | if (padding > 0) { | |
| 574 | try code.writer().writeByteNTimes(0, padding); | |
| 575 | } | |
| 556 | const error_val = if (!is_payload) typed_value.val else Value.initTag(.zero); | |
| 557 | const begin = code.items.len; | |
| 558 | switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ | |
| 559 | .ty = error_ty, | |
| 560 | .val = error_val, | |
| 561 | }, code, debug_output)) { | |
| 562 | .appended => {}, | |
| 563 | .externally_managed => |external_slice| { | |
| 564 | code.appendSliceAssumeCapacity(external_slice); | |
| 565 | }, | |
| 566 | .fail => |em| return Result{ .fail = em }, | |
| 576 | 567 | } |
| 577 | 568 | |
| 578 | 569 | if (payload_ty.hasRuntimeBits()) { |
| 579 | 570 | const payload_val = if (typed_value.val.castTag(.eu_payload)) |val| val.data else Value.initTag(.undef); |
| 580 | const begin = code.items.len; | |
| 581 | 571 | switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ |
| 582 | 572 | .ty = payload_ty, |
| 583 | 573 | .val = payload_val, |
| ... | ... | @@ -588,13 +578,14 @@ pub fn generateSymbol( |
| 588 | 578 | }, |
| 589 | 579 | .fail => |em| return Result{ .fail = em }, |
| 590 | 580 | } |
| 591 | const unpadded_end = code.items.len - begin; | |
| 592 | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); | |
| 593 | const padding = try math.cast(usize, padded_end - unpadded_end); | |
| 581 | } | |
| 594 | 582 | |
| 595 | if (padding > 0) { | |
| 596 | try code.writer().writeByteNTimes(0, padding); | |
| 597 | } | |
| 583 | const unpadded_end = code.items.len - begin; | |
| 584 | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); | |
| 585 | const padding = try math.cast(usize, padded_end - unpadded_end); | |
| 586 | ||
| 587 | if (padding > 0) { | |
| 588 | try code.writer().writeByteNTimes(0, padding); | |
| 598 | 589 | } |
| 599 | 590 | |
| 600 | 591 | return Result{ .appended = {} }; |
test/behavior/error.zig-5| ... | ... | @@ -23,7 +23,6 @@ fn shouldBeNotEqual(a: anyerror, b: anyerror) void { |
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | test "error binary operator" { |
| 26 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 27 | 26 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 28 | 27 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 29 | 28 | |
| ... | ... | @@ -58,7 +57,6 @@ pub fn baz() anyerror!i32 { |
| 58 | 57 | } |
| 59 | 58 | |
| 60 | 59 | test "error wrapping" { |
| 61 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 62 | 60 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 63 | 61 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 64 | 62 | |
| ... | ... | @@ -66,7 +64,6 @@ test "error wrapping" { |
| 66 | 64 | } |
| 67 | 65 | |
| 68 | 66 | test "unwrap simple value from error" { |
| 69 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 70 | 67 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 71 | 68 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 72 | 69 | |
| ... | ... | @@ -102,7 +99,6 @@ test "syntax: optional operator in front of error union operator" { |
| 102 | 99 | } |
| 103 | 100 | |
| 104 | 101 | test "widen cast integer payload of error union function call" { |
| 105 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 106 | 102 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 107 | 103 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 108 | 104 | |
| ... | ... | @@ -307,7 +303,6 @@ test "error: Infer error set from literals" { |
| 307 | 303 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 308 | 304 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 309 | 305 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 310 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 311 | 306 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 312 | 307 | |
| 313 | 308 | _ = nullLiteral("n") catch |err| handleErrors(err); |