| ... | ... | @@ -747,15 +747,23 @@ pub fn generateSymbol( |
| 747 | 747 | .Vector => switch (typed_value.val.tag()) { |
| 748 | 748 | .bytes => { |
| 749 | 749 | const bytes = typed_value.val.castTag(.bytes).?.data; |
| 750 | | const len = @intCast(usize, typed_value.ty.arrayLen()); |
| 751 | | try code.ensureUnusedCapacity(len); |
| 750 | const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow; |
| 751 | const padding = math.cast(usize, typed_value.ty.abiSize(target) - len) orelse |
| 752 | return error.Overflow; |
| 753 | try code.ensureUnusedCapacity(len + padding); |
| 752 | 754 | code.appendSliceAssumeCapacity(bytes[0..len]); |
| 755 | if (padding > 0) try code.writer().writeByteNTimes(0, padding); |
| 753 | 756 | return Result.ok; |
| 754 | 757 | }, |
| 755 | 758 | .aggregate => { |
| 756 | 759 | const elem_vals = typed_value.val.castTag(.aggregate).?.data; |
| 757 | 760 | const elem_ty = typed_value.ty.elemType(); |
| 758 | | const len = @intCast(usize, typed_value.ty.arrayLen()); |
| 761 | const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow; |
| 762 | const padding = math.cast(usize, typed_value.ty.abiSize(target) - |
| 763 | (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) { |
| 764 | error.DivisionByZero => unreachable, |
| 765 | else => |e| return e, |
| 766 | })) orelse return error.Overflow; |
| 759 | 767 | for (elem_vals[0..len]) |elem_val| { |
| 760 | 768 | switch (try generateSymbol(bin_file, src_loc, .{ |
| 761 | 769 | .ty = elem_ty, |
| ... | ... | @@ -765,13 +773,18 @@ pub fn generateSymbol( |
| 765 | 773 | .fail => |em| return Result{ .fail = em }, |
| 766 | 774 | } |
| 767 | 775 | } |
| 776 | if (padding > 0) try code.writer().writeByteNTimes(0, padding); |
| 768 | 777 | return Result.ok; |
| 769 | 778 | }, |
| 770 | 779 | .repeated => { |
| 771 | 780 | const array = typed_value.val.castTag(.repeated).?.data; |
| 772 | 781 | const elem_ty = typed_value.ty.childType(); |
| 773 | 782 | const len = typed_value.ty.arrayLen(); |
| 774 | | |
| 783 | const padding = math.cast(usize, typed_value.ty.abiSize(target) - |
| 784 | (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) { |
| 785 | error.DivisionByZero => unreachable, |
| 786 | else => |e| return e, |
| 787 | })) orelse return error.Overflow; |
| 775 | 788 | var index: u64 = 0; |
| 776 | 789 | while (index < len) : (index += 1) { |
| 777 | 790 | switch (try generateSymbol(bin_file, src_loc, .{ |
| ... | ... | @@ -782,13 +795,17 @@ pub fn generateSymbol( |
| 782 | 795 | .fail => |em| return Result{ .fail = em }, |
| 783 | 796 | } |
| 784 | 797 | } |
| 798 | if (padding > 0) try code.writer().writeByteNTimes(0, padding); |
| 785 | 799 | return Result.ok; |
| 786 | 800 | }, |
| 787 | 801 | .str_lit => { |
| 788 | 802 | const str_lit = typed_value.val.castTag(.str_lit).?.data; |
| 789 | 803 | const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len]; |
| 790 | | try code.ensureUnusedCapacity(str_lit.len); |
| 804 | const padding = math.cast(usize, typed_value.ty.abiSize(target) - str_lit.len) orelse |
| 805 | return error.Overflow; |
| 806 | try code.ensureUnusedCapacity(str_lit.len + padding); |
| 791 | 807 | code.appendSliceAssumeCapacity(bytes); |
| 808 | if (padding > 0) try code.writer().writeByteNTimes(0, padding); |
| 792 | 809 | return Result.ok; |
| 793 | 810 | }, |
| 794 | 811 | else => unreachable, |