Commit 5b74278510

Jacob Young <jacobly0@users.noreply.github.com>
2023-06-25 06:43:18
x86_64: fix global pointers to packed struct fields
1 parent 9d0b8a2
Changed files (3)
src/codegen.zig
@@ -684,10 +684,22 @@ fn lowerParentPtr(
                     .struct_type,
                     .anon_struct_type,
                     .union_type,
-                    => @as(u32, @intCast(base_type.toType().structFieldOffset(
-                        @as(u32, @intCast(field.index)),
-                        mod,
-                    ))),
+                    => switch (base_type.toType().containerLayout(mod)) {
+                        .Auto, .Extern => @intCast(base_type.toType().structFieldOffset(
+                            @intCast(field.index),
+                            mod,
+                        )),
+                        .Packed => if (mod.typeToStruct(base_type.toType())) |struct_obj|
+                            math.divExact(u16, struct_obj.packedFieldBitOffset(
+                                mod,
+                                @intCast(field.index),
+                            ), 8) catch |err| switch (err) {
+                                error.UnexpectedRemainder => 0,
+                                error.DivisionByZero => unreachable,
+                            }
+                        else
+                            0,
+                    },
                     else => unreachable,
                 }),
             );
test/behavior/packed-struct.zig
@@ -376,7 +376,6 @@ test "load pointer from packed struct" {
 }
 
 test "@intFromPtr on a packed struct field" {
-    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
@@ -608,7 +607,6 @@ test "pointer to container level packed struct field" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
-    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
 
test/behavior/struct.zig
@@ -1077,7 +1077,6 @@ test "packed struct with undefined initializers" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
-    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;