authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-19 03:12:34-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-25 19:14:03-04:00
log3f13987a761ed805656bec3b8e4db591a1cbc8ed
treedd29f1ff5aea5c55ef53e579e72441217da1a1db
parente13aa915b20db3f5521f5f280ba0bd9b1a79f1c0

x86_64: add missing padding to global unions


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

src/codegen.zig+5-5
...@@ -558,7 +558,7 @@ pub fn generateSymbol(...@@ -558,7 +558,7 @@ pub fn generateSymbol(
558 }558 }
559559
560 // Check if we should store the tag first.560 // Check if we should store the tag first.
561 if (layout.tag_align >= layout.payload_align) {561 if (layout.tag_size > 0 and layout.tag_align >= layout.payload_align) {
562 switch (try generateSymbol(bin_file, src_loc, .{562 switch (try generateSymbol(bin_file, src_loc, .{
563 .ty = typed_value.ty.unionTagType(mod).?,563 .ty = typed_value.ty.unionTagType(mod).?,
564 .val = un.tag.toValue(),564 .val = un.tag.toValue(),
...@@ -589,7 +589,7 @@ pub fn generateSymbol(...@@ -589,7 +589,7 @@ pub fn generateSymbol(
589 }589 }
590 }590 }
591591
592 if (layout.tag_size > 0) {592 if (layout.tag_size > 0 and layout.tag_align < layout.payload_align) {
593 switch (try generateSymbol(bin_file, src_loc, .{593 switch (try generateSymbol(bin_file, src_loc, .{
594 .ty = union_ty.tag_ty,594 .ty = union_ty.tag_ty,
595 .val = un.tag.toValue(),595 .val = un.tag.toValue(),
...@@ -597,10 +597,10 @@ pub fn generateSymbol(...@@ -597,10 +597,10 @@ pub fn generateSymbol(
597 .ok => {},597 .ok => {},
598 .fail => |em| return Result{ .fail = em },598 .fail => |em| return Result{ .fail = em },
599 }599 }
600 }
601600
602 if (layout.padding > 0) {601 if (layout.padding > 0) {
603 try code.writer().writeByteNTimes(0, layout.padding);602 try code.writer().writeByteNTimes(0, layout.padding);
603 }
604 }604 }
605 },605 },
606 .memoized_call => unreachable,606 .memoized_call => unreachable,
test/behavior/bugs/1381.zig-1
...@@ -12,7 +12,6 @@ const A = union(enum) {...@@ -12,7 +12,6 @@ const A = union(enum) {
12};12};
1313
14test "union that needs padding bytes inside an array" {14test "union that needs padding bytes inside an array" {
15 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;15 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;16 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
18 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO17 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO