commit 5b742785100bb2662f6fc0ee11ac84b2fed9be9e (tree)
parent 9d0b8a27b64c23ca42c15160abea0dd12077332e
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Sun, 25 Jun 2023 00:43:18 -0400
x86_64: fix global pointers to packed struct fields
Diffstat:
3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/src/codegen.zig b/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,
}),
);
diff --git a/test/behavior/packed-struct.zig b/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;
diff --git a/test/behavior/struct.zig b/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;