x86_64: add missing padding to global unions

This commit is contained in:
Jacob Young 2023-05-19 03:12:34 -04:00
parent e13aa915b2
commit 3f13987a76
2 changed files with 5 additions and 6 deletions

View File

@ -558,7 +558,7 @@ pub fn generateSymbol(
} }
// Check if we should store the tag first. // Check if we should store the tag first.
if (layout.tag_align >= layout.payload_align) { if (layout.tag_size > 0 and layout.tag_align >= layout.payload_align) {
switch (try generateSymbol(bin_file, src_loc, .{ switch (try generateSymbol(bin_file, src_loc, .{
.ty = typed_value.ty.unionTagType(mod).?, .ty = typed_value.ty.unionTagType(mod).?,
.val = un.tag.toValue(), .val = un.tag.toValue(),
@ -589,7 +589,7 @@ pub fn generateSymbol(
} }
} }
if (layout.tag_size > 0) { if (layout.tag_size > 0 and layout.tag_align < layout.payload_align) {
switch (try generateSymbol(bin_file, src_loc, .{ switch (try generateSymbol(bin_file, src_loc, .{
.ty = union_ty.tag_ty, .ty = union_ty.tag_ty,
.val = un.tag.toValue(), .val = un.tag.toValue(),
@ -597,10 +597,10 @@ pub fn generateSymbol(
.ok => {}, .ok => {},
.fail => |em| return Result{ .fail = em }, .fail => |em| return Result{ .fail = em },
} }
}
if (layout.padding > 0) { if (layout.padding > 0) {
try code.writer().writeByteNTimes(0, layout.padding); try code.writer().writeByteNTimes(0, layout.padding);
}
} }
}, },
.memoized_call => unreachable, .memoized_call => unreachable,

View File

@ -12,7 +12,6 @@ const A = union(enum) {
}; };
test "union that needs padding bytes inside an array" { test "union that needs padding bytes inside an array" {
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO