authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-17 02:06:54-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-18 20:42:38-04:00
log60e69fdaa15a304f374df3e067e08aeaa622d412
tree97334e532a0841adb9aab41b7b79c8273a1b674f
parent35da95fe8765874a1ccffb0d7bfd523b14f44a4a

codegen: emit global vector padding


2 files changed, 22 insertions(+), 6 deletions(-)

src/codegen.zig+22-5
......@@ -747,15 +747,23 @@ pub fn generateSymbol(
747747 .Vector => switch (typed_value.val.tag()) {
748748 .bytes => {
749749 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);
752754 code.appendSliceAssumeCapacity(bytes[0..len]);
755 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
753756 return Result.ok;
754757 },
755758 .aggregate => {
756759 const elem_vals = typed_value.val.castTag(.aggregate).?.data;
757760 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;
759767 for (elem_vals[0..len]) |elem_val| {
760768 switch (try generateSymbol(bin_file, src_loc, .{
761769 .ty = elem_ty,
......@@ -765,13 +773,18 @@ pub fn generateSymbol(
765773 .fail => |em| return Result{ .fail = em },
766774 }
767775 }
776 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
768777 return Result.ok;
769778 },
770779 .repeated => {
771780 const array = typed_value.val.castTag(.repeated).?.data;
772781 const elem_ty = typed_value.ty.childType();
773782 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;
775788 var index: u64 = 0;
776789 while (index < len) : (index += 1) {
777790 switch (try generateSymbol(bin_file, src_loc, .{
......@@ -782,13 +795,17 @@ pub fn generateSymbol(
782795 .fail => |em| return Result{ .fail = em },
783796 }
784797 }
798 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
785799 return Result.ok;
786800 },
787801 .str_lit => {
788802 const str_lit = typed_value.val.castTag(.str_lit).?.data;
789803 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);
791807 code.appendSliceAssumeCapacity(bytes);
808 if (padding > 0) try code.writer().writeByteNTimes(0, padding);
792809 return Result.ok;
793810 },
794811 else => unreachable,
test/behavior/vector.zig-1
......@@ -1142,7 +1142,6 @@ test "loading the second vector from a slice of vectors" {
11421142
11431143test "array of vectors is copied" {
11441144 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1145 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11461145 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11471146 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11481147 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO