aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-06-25 00:43:18 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-06-25 19:14:03 -0400
commit5b742785100bb2662f6fc0ee11ac84b2fed9be9e (patch)
tree5f92621ee91b0f64f8541faa7393ed6d210aec22 /src/codegen.zig
parent9d0b8a27b64c23ca42c15160abea0dd12077332e (diff)
downloadzig-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.zig20
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,
}),
);