aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-09-24 19:42:06 -0700
committerGitHub <noreply@github.com>2023-09-24 19:42:06 -0700
commiteb072fa52846c6583b856c8c88d50d65f46b3667 (patch)
treef1c1f213685f476200562bcc870bc774bd81fa2f /src/type.zig
parentdf5f0517b33b5f7bc2a508cf6a0ee62246f02d21 (diff)
parentc08c0fc6eddf601785abfbc5e5a9ab5c89d7cfbf (diff)
downloadzig-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.zig21
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 {