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