diff options
| author | kcbanner <kcbanner@gmail.com> | 2023-10-21 12:03:36 -0400 |
|---|---|---|
| committer | Matthew Lugg <mlugg@mlugg.co.uk> | 2023-10-31 01:35:58 +0000 |
| commit | 4d044ee7e0b1ca61b8f2205f318449780ae23bd2 (patch) | |
| tree | 682b42b724238e7dc0231685eecaf0f408a1620e /src/Module.zig | |
| parent | ffaeb4533395fafcf020d0aca2f2efd58e48a384 (diff) | |
| download | zig-4d044ee7e0b1ca61b8f2205f318449780ae23bd2.tar.gz zig-4d044ee7e0b1ca61b8f2205f318449780ae23bd2.zip | |
sema: Add union alignment resolution
- Add resolveUnionAlignment, to resolve a union's alignment only, without triggering layout resolution.
- Update resolveUnionLayout to cache size, alignment, and padding. abiSizeAdvanced and abiAlignmentAdvanced
now use this information instead of computing it each time.
Diffstat (limited to 'src/Module.zig')
| -rw-r--r-- | src/Module.zig | 26 |
1 files changed, 3 insertions, 23 deletions
diff --git a/src/Module.zig b/src/Module.zig index 8af788063d..b051ced66f 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -6538,31 +6538,11 @@ pub fn getUnionLayout(mod: *Module, u: InternPool.UnionType) UnionLayout { .padding = 0, }; } - // Put the tag before or after the payload depending on which one's - // alignment is greater. + const tag_size = u.enum_tag_ty.toType().abiSize(mod); const tag_align = u.enum_tag_ty.toType().abiAlignment(mod).max(.@"1"); - var size: u64 = 0; - var padding: u32 = undefined; - if (tag_align.compare(.gte, payload_align)) { - // {Tag, Payload} - size += tag_size; - size = payload_align.forward(size); - size += payload_size; - const prev_size = size; - size = tag_align.forward(size); - padding = @intCast(size - prev_size); - } else { - // {Payload, Tag} - size += payload_size; - size = tag_align.forward(size); - size += tag_size; - const prev_size = size; - size = payload_align.forward(size); - padding = @intCast(size - prev_size); - } return .{ - .abi_size = size, + .abi_size = u.size, .abi_align = tag_align.max(payload_align), .most_aligned_field = most_aligned_field, .most_aligned_field_size = most_aligned_field_size, @@ -6571,7 +6551,7 @@ pub fn getUnionLayout(mod: *Module, u: InternPool.UnionType) UnionLayout { .payload_align = payload_align, .tag_align = tag_align, .tag_size = tag_size, - .padding = padding, + .padding = u.padding, }; } |
