diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-06-07 20:51:14 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-06-07 21:05:40 -0700 |
| commit | 3e30ba3f20dce2d406253de3fc0eb86934a3eaa7 (patch) | |
| tree | 37cde6ce42dc2e326bd7beb599b6ad0d77051c28 /src/type.zig | |
| parent | 70dc910086582b028d404d5de5049ceae0a95161 (diff) | |
| download | zig-3e30ba3f20dce2d406253de3fc0eb86934a3eaa7.tar.gz zig-3e30ba3f20dce2d406253de3fc0eb86934a3eaa7.zip | |
stage2: better codegen for byte-aligned packed struct fields
* Sema: handle overaligned packed struct field pointers
* LLVM: handle byte-aligned packed struct field pointers
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 21 |
1 files changed, 21 insertions, 0 deletions
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, |
