authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-25 00:43:18-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-25 19:14:03-04:00
log5b742785100bb2662f6fc0ee11ac84b2fed9be9e
tree5f92621ee91b0f64f8541faa7393ed6d210aec22
parent9d0b8a27b64c23ca42c15160abea0dd12077332e

x86_64: fix global pointers to packed struct fields


3 files changed, 16 insertions(+), 7 deletions(-)

src/codegen.zig+16-4
...@@ -684,10 +684,22 @@ fn lowerParentPtr(...@@ -684,10 +684,22 @@ fn lowerParentPtr(
684 .struct_type,684 .struct_type,
685 .anon_struct_type,685 .anon_struct_type,
686 .union_type,686 .union_type,
687 => @as(u32, @intCast(base_type.toType().structFieldOffset(687 => switch (base_type.toType().containerLayout(mod)) {
688 @as(u32, @intCast(field.index)),688 .Auto, .Extern => @intCast(base_type.toType().structFieldOffset(
689 mod,689 @intCast(field.index),
690 ))),690 mod,
691 )),
692 .Packed => if (mod.typeToStruct(base_type.toType())) |struct_obj|
693 math.divExact(u16, struct_obj.packedFieldBitOffset(
694 mod,
695 @intCast(field.index),
696 ), 8) catch |err| switch (err) {
697 error.UnexpectedRemainder => 0,
698 error.DivisionByZero => unreachable,
699 }
700 else
701 0,
702 },
691 else => unreachable,703 else => unreachable,
692 }),704 }),
693 );705 );
test/behavior/packed-struct.zig-2
...@@ -376,7 +376,6 @@ test "load pointer from packed struct" {...@@ -376,7 +376,6 @@ test "load pointer from packed struct" {
376}376}
377377
378test "@intFromPtr on a packed struct field" {378test "@intFromPtr on a packed struct field" {
379 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
380 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;379 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
381 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;380 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
382 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO381 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -608,7 +607,6 @@ test "pointer to container level packed struct field" {...@@ -608,7 +607,6 @@ test "pointer to container level packed struct field" {
608 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;607 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
609 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;608 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
610 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;609 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
611 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
612 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO610 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
613 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;611 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
614612
test/behavior/struct.zig-1
...@@ -1077,7 +1077,6 @@ test "packed struct with undefined initializers" {...@@ -1077,7 +1077,6 @@ test "packed struct with undefined initializers" {
1077 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1077 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1078 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1078 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1079 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1079 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1080 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1081 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1080 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1082 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1081 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10831082