Commit 3f13987a76

Jacob Young <jacobly0@users.noreply.github.com>
2023-05-19 09:12:34
x86_64: add missing padding to global unions
1 parent e13aa91
Changed files (2)
src
test
behavior
src/codegen.zig
@@ -558,7 +558,7 @@ pub fn generateSymbol(
             }
 
             // 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, .{
                     .ty = typed_value.ty.unionTagType(mod).?,
                     .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, .{
                     .ty = union_ty.tag_ty,
                     .val = un.tag.toValue(),
@@ -597,10 +597,10 @@ pub fn generateSymbol(
                     .ok => {},
                     .fail => |em| return Result{ .fail = em },
                 }
-            }
 
-            if (layout.padding > 0) {
-                try code.writer().writeByteNTimes(0, layout.padding);
+                if (layout.padding > 0) {
+                    try code.writer().writeByteNTimes(0, layout.padding);
+                }
             }
         },
         .memoized_call => unreachable,
test/behavior/bugs/1381.zig
@@ -12,7 +12,6 @@ const A = union(enum) {
 };
 
 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_arm) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO