aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-06-07 20:51:14 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-06-07 21:05:40 -0700
commit3e30ba3f20dce2d406253de3fc0eb86934a3eaa7 (patch)
tree37cde6ce42dc2e326bd7beb599b6ad0d77051c28 /src/type.zig
parent70dc910086582b028d404d5de5049ceae0a95161 (diff)
downloadzig-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.zig21
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,