diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-09-24 19:42:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-24 19:42:06 -0700 |
| commit | eb072fa52846c6583b856c8c88d50d65f46b3667 (patch) | |
| tree | f1c1f213685f476200562bcc870bc774bd81fa2f /src/type.zig | |
| parent | df5f0517b33b5f7bc2a508cf6a0ee62246f02d21 (diff) | |
| parent | c08c0fc6eddf601785abfbc5e5a9ab5c89d7cfbf (diff) | |
| download | zig-eb072fa52846c6583b856c8c88d50d65f46b3667.tar.gz zig-eb072fa52846c6583b856c8c88d50d65f46b3667.zip | |
Merge pull request #17256 from ziglang/packed-bit-offsets
compiler: packed structs cache bit offsets
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/type.zig b/src/type.zig index a4f85ae946..ee0b19d099 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3021,27 +3021,24 @@ pub const Type = struct { }; } - pub fn packedStructFieldByteOffset(ty: Type, field_index: usize, mod: *Module) u32 { + pub fn packedStructFieldBitOffset(ty: Type, field_index: usize, 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 bit_offset: u16 = undefined; - var elem_size_bits: u16 = undefined; - var running_bits: u16 = 0; + 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: u16 = @intCast(field_ty.toType().bitSize(mod)); - if (i == field_index) { - bit_offset = running_bits; - elem_size_bits = field_bits; - } + const field_bits: u32 = @intCast(field_ty.toType().bitSize(mod)); running_bits += field_bits; } - const byte_offset = bit_offset / 8; - return byte_offset; + return running_bits; + } + + pub fn packedStructFieldByteOffset(ty: Type, field_index: usize, mod: *Module) u32 { + return packedStructFieldBitOffset(ty, field_index, mod) / 8; } pub const FieldOffset = struct { |
