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