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(
684684 .struct_type,
685685 .anon_struct_type,
686686 .union_type,
687 => @as(u32, @intCast(base_type.toType().structFieldOffset(
688 @as(u32, @intCast(field.index)),
689 mod,
690 ))),
687 => switch (base_type.toType().containerLayout(mod)) {
688 .Auto, .Extern => @intCast(base_type.toType().structFieldOffset(
689 @intCast(field.index),
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 },
691703 else => unreachable,
692704 }),
693705 );
test/behavior/packed-struct.zig-2
......@@ -376,7 +376,6 @@ test "load pointer from packed struct" {
376376}
377377
378378test "@intFromPtr on a packed struct field" {
379 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
380379 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
381380 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
382381 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -608,7 +607,6 @@ test "pointer to container level packed struct field" {
608607 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
609608 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
610609 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
611 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
612610 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
613611 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" {
10771077 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10781078 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10791079 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1080 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10811080 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10821081 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10831082