From 62d178e91af57c19d0ac000fe6930039a23e53a3 Mon Sep 17 00:00:00 2001 From: Xavier Bouchoux Date: Sat, 29 Jul 2023 20:08:08 +0200 Subject: codegen: fix field offsets in packed structs * add nested packed struct/union behavior tests * use ptr_info.packed_offset rather than trying to duplicate the logic from Sema.structFieldPtrByIndex() * use the container_ptr_info.packed_offset to account for non-aligned nested structs. * dedup type.packedStructFieldBitOffset() and module.structPackedFieldBitOffset() --- src/type.zig | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) (limited to 'src/type.zig') diff --git a/src/type.zig b/src/type.zig index 79be8b4c5b..a7b760a482 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3028,24 +3028,10 @@ pub const Type = struct { }; } - pub fn packedStructFieldBitOffset(ty: Type, field_index: usize, mod: *Module) u32 { + pub fn packedStructFieldByteOffset(ty: Type, field_index: u32, mod: *Module) u32 { const ip = &mod.intern_pool; const struct_type = ip.indexToKey(ty.toIntern()).struct_type; - assert(struct_type.layout == .Packed); - comptime assert(Type.packed_struct_layout_version == 2); - - var running_bits: u32 = 0; - for (struct_type.field_types.get(ip), 0..) |field_ty, i| { - if (i == field_index) break; - if (!field_ty.toType().hasRuntimeBits(mod)) continue; - const field_bits: u32 = @intCast(field_ty.toType().bitSize(mod)); - running_bits += field_bits; - } - return running_bits; - } - - pub fn packedStructFieldByteOffset(ty: Type, field_index: usize, mod: *Module) u32 { - return packedStructFieldBitOffset(ty, field_index, mod) / 8; + return @divExact(mod.structPackedFieldBitOffset(struct_type, field_index), 8); } pub const FieldOffset = struct { -- cgit v1.2.3