diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-09-25 17:52:50 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-09-25 17:54:52 -0700 |
| commit | 04366576ea4be4959b596ebff7041d17e18d08d8 (patch) | |
| tree | 94dceb8f1e846e09356e5b40b884791a7cc314eb /src/type.zig | |
| parent | 15f55b2805541276f491d255f60f501c8cbd1191 (diff) | |
| download | zig-04366576ea4be4959b596ebff7041d17e18d08d8.tar.gz zig-04366576ea4be4959b596ebff7041d17e18d08d8.zip | |
stage2: implement `@sizeOf` for non-packed structs
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/type.zig b/src/type.zig index 0381111345..bd008e809a 100644 --- a/src/type.zig +++ b/src/type.zig @@ -1765,7 +1765,21 @@ pub const Type = extern union { .@"struct" => { const s = self.castTag(.@"struct").?.data; assert(s.status == .have_layout); - @panic("TODO abiSize struct"); + const is_packed = s.layout == .Packed; + if (is_packed) @panic("TODO packed structs"); + var size: u64 = 0; + for (s.fields.values()) |field| { + const field_align = a: { + if (field.abi_align.tag() == .abi_align_default) { + break :a field.ty.abiAlignment(target); + } else { + break :a field.abi_align.toUnsignedInt(); + } + }; + size = std.mem.alignForwardGeneric(u64, size, field_align); + size += field.ty.abiSize(target); + } + return size; }, .enum_simple, .enum_full, .enum_nonexhaustive => { var buffer: Payload.Bits = undefined; |
