| ... | ... | @@ -573,16 +573,10 @@ pub fn generateSymbol( |
| 573 | 573 | const layout = typed_value.ty.unionGetLayout(target); |
| 574 | 574 | |
| 575 | 575 | if (layout.payload_size == 0) { |
| 576 | | switch (try generateSymbol(bin_file, src_loc, .{ |
| 576 | return generateSymbol(bin_file, src_loc, .{ |
| 577 | 577 | .ty = typed_value.ty.unionTagType().?, |
| 578 | 578 | .val = union_obj.tag, |
| 579 | | }, code, debug_output, reloc_info)) { |
| 580 | | .appended => {}, |
| 581 | | .externally_managed => |external_slice| { |
| 582 | | code.appendSliceAssumeCapacity(external_slice); |
| 583 | | }, |
| 584 | | .fail => |em| return Result{ .fail = em }, |
| 585 | | } |
| 579 | }, code, debug_output, reloc_info); |
| 586 | 580 | } |
| 587 | 581 | |
| 588 | 582 | // Check if we should store the tag first. |
| ... | ... | @@ -703,20 +697,30 @@ pub fn generateSymbol( |
| 703 | 697 | |
| 704 | 698 | const abi_align = typed_value.ty.abiAlignment(target); |
| 705 | 699 | |
| 706 | | const error_val = if (!is_payload) typed_value.val else Value.initTag(.zero); |
| 707 | | const begin = code.items.len; |
| 708 | | switch (try generateSymbol(bin_file, src_loc, .{ |
| 709 | | .ty = error_ty, |
| 710 | | .val = error_val, |
| 711 | | }, code, debug_output, reloc_info)) { |
| 712 | | .appended => {}, |
| 713 | | .externally_managed => |external_slice| { |
| 714 | | code.appendSliceAssumeCapacity(external_slice); |
| 715 | | }, |
| 716 | | .fail => |em| return Result{ .fail = em }, |
| 700 | { |
| 701 | const error_val = if (!is_payload) typed_value.val else Value.initTag(.zero); |
| 702 | const begin = code.items.len; |
| 703 | switch (try generateSymbol(bin_file, src_loc, .{ |
| 704 | .ty = error_ty, |
| 705 | .val = error_val, |
| 706 | }, code, debug_output, reloc_info)) { |
| 707 | .appended => {}, |
| 708 | .externally_managed => |external_slice| { |
| 709 | code.appendSliceAssumeCapacity(external_slice); |
| 710 | }, |
| 711 | .fail => |em| return Result{ .fail = em }, |
| 712 | } |
| 713 | const unpadded_end = code.items.len - begin; |
| 714 | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); |
| 715 | const padding = try math.cast(usize, padded_end - unpadded_end); |
| 716 | |
| 717 | if (padding > 0) { |
| 718 | try code.writer().writeByteNTimes(0, padding); |
| 719 | } |
| 717 | 720 | } |
| 718 | 721 | |
| 719 | 722 | if (payload_ty.hasRuntimeBits()) { |
| 723 | const begin = code.items.len; |
| 720 | 724 | const payload_val = if (typed_value.val.castTag(.eu_payload)) |val| val.data else Value.initTag(.undef); |
| 721 | 725 | switch (try generateSymbol(bin_file, src_loc, .{ |
| 722 | 726 | .ty = payload_ty, |
| ... | ... | @@ -728,14 +732,13 @@ pub fn generateSymbol( |
| 728 | 732 | }, |
| 729 | 733 | .fail => |em| return Result{ .fail = em }, |
| 730 | 734 | } |
| 731 | | } |
| 735 | const unpadded_end = code.items.len - begin; |
| 736 | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); |
| 737 | const padding = try math.cast(usize, padded_end - unpadded_end); |
| 732 | 738 | |
| 733 | | const unpadded_end = code.items.len - begin; |
| 734 | | const padded_end = mem.alignForwardGeneric(u64, unpadded_end, abi_align); |
| 735 | | const padding = try math.cast(usize, padded_end - unpadded_end); |
| 736 | | |
| 737 | | if (padding > 0) { |
| 738 | | try code.writer().writeByteNTimes(0, padding); |
| 739 | if (padding > 0) { |
| 740 | try code.writer().writeByteNTimes(0, padding); |
| 741 | } |
| 739 | 742 | } |
| 740 | 743 | |
| 741 | 744 | return Result{ .appended = {} }; |