aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-10-21 12:03:36 -0400
committerMatthew Lugg <mlugg@mlugg.co.uk>2023-10-31 01:35:58 +0000
commit4d044ee7e0b1ca61b8f2205f318449780ae23bd2 (patch)
tree682b42b724238e7dc0231685eecaf0f408a1620e /src/Module.zig
parentffaeb4533395fafcf020d0aca2f2efd58e48a384 (diff)
downloadzig-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.zig26
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,
};
}