diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-06-25 00:43:18 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-06-25 19:14:03 -0400 |
| commit | 5b742785100bb2662f6fc0ee11ac84b2fed9be9e (patch) | |
| tree | 5f92621ee91b0f64f8541faa7393ed6d210aec22 /src/codegen.zig | |
| parent | 9d0b8a27b64c23ca42c15160abea0dd12077332e (diff) | |
| download | zig-5b742785100bb2662f6fc0ee11ac84b2fed9be9e.tar.gz zig-5b742785100bb2662f6fc0ee11ac84b2fed9be9e.zip | |
x86_64: fix global pointers to packed struct fields
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 9e5ae11a63..1718201e6c 100644 --- 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, }), ); |
