From 3e30ba3f20dce2d406253de3fc0eb86934a3eaa7 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 7 Jun 2022 20:51:14 -0700 Subject: stage2: better codegen for byte-aligned packed struct fields * Sema: handle overaligned packed struct field pointers * LLVM: handle byte-aligned packed struct field pointers --- src/type.zig | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/type.zig') diff --git a/src/type.zig b/src/type.zig index 14c613a947..8e5eaf0ec7 100644 --- a/src/type.zig +++ b/src/type.zig @@ -5591,6 +5591,27 @@ pub const Type = extern union { } } + pub fn packedStructFieldByteOffset(ty: Type, field_index: usize, target: Target) u32 { + const struct_obj = ty.castTag(.@"struct").?.data; + assert(struct_obj.layout == .Packed); + comptime assert(Type.packed_struct_layout_version == 2); + + var bit_offset: u16 = undefined; + var running_bits: u16 = 0; + for (struct_obj.fields.values()) |f, i| { + if (!f.ty.hasRuntimeBits()) continue; + + if (i == field_index) { + bit_offset = running_bits; + } + running_bits += @intCast(u16, f.ty.bitSize(target)); + } + const host_size = (running_bits + 7) / 8; + _ = host_size; // TODO big-endian + const byte_offset = bit_offset / 8; + return byte_offset; + } + pub const FieldOffset = struct { field: usize, offset: u64, -- cgit v1.2.3