aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-11-03 22:33:10 -0500
committerJacob Young <15544577+jacobly0@users.noreply.github.com>2025-11-04 06:04:30 -0500
commit459f3b7edef14da7d9ec29a77329601469f08b36 (patch)
tree561fb06a0b68bc2ac652aae3ea0ec034882fc828 /src/codegen.zig
parentea76946d2af588d135e79a97f19d128acfeb8915 (diff)
downloadzig-459f3b7edef14da7d9ec29a77329601469f08b36.tar.gz
zig-459f3b7edef14da7d9ec29a77329601469f08b36.zip
codegen: fix tuple padding
Closes #25797
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig37
1 files changed, 12 insertions, 25 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index caff954e07..6bdfa32f45 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -534,9 +534,7 @@ pub fn generateSymbol(
while (index < vector_type.len) : (index += 1) {
try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(switch (aggregate.storage) {
.bytes => unreachable,
- .elems => |elems| elems[
- math.cast(usize, index) orelse return error.Overflow
- ],
+ .elems => |elems| elems[math.cast(usize, index) orelse return error.Overflow],
.repeated_elem => |elem| elem,
}), w, reloc_parent);
}
@@ -551,35 +549,24 @@ pub fn generateSymbol(
},
.tuple_type => |tuple| {
const struct_begin = w.end;
- for (
- tuple.types.get(ip),
- tuple.values.get(ip),
- 0..,
- ) |field_ty, comptime_val, index| {
- if (comptime_val != .none) continue;
+ for (tuple.types.get(ip), tuple.values.get(ip), 0..) |field_ty, field_val, field_index| {
+ if (field_val != .none) continue;
if (!Type.fromInterned(field_ty).hasRuntimeBits(zcu)) continue;
- const field_val = switch (aggregate.storage) {
+ try w.splatByteAll(0, math.cast(usize, struct_begin +
+ Type.fromInterned(field_ty).abiAlignment(zcu).forward(w.end - struct_begin) - w.end) orelse
+ return error.Overflow);
+ try generateSymbol(bin_file, pt, src_loc, .fromInterned(switch (aggregate.storage) {
.bytes => |bytes| try pt.intern(.{ .int = .{
.ty = field_ty,
- .storage = .{ .u64 = bytes.at(index, ip) },
+ .storage = .{ .u64 = bytes.at(field_index, ip) },
} }),
- .elems => |elems| elems[index],
+ .elems => |elems| elems[field_index],
.repeated_elem => |elem| elem,
- };
-
- try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(field_val), w, reloc_parent);
- const unpadded_field_end = w.end - struct_begin;
-
- // Pad struct members if required
- const padded_field_end = ty.structFieldOffset(index + 1, zcu);
- const padding = math.cast(usize, padded_field_end - unpadded_field_end) orelse
- return error.Overflow;
-
- if (padding > 0) {
- try w.splatByteAll(0, padding);
- }
+ }), w, reloc_parent);
}
+ try w.splatByteAll(0, math.cast(usize, struct_begin + ty.abiSize(zcu) - w.end) orelse
+ return error.Overflow);
},
.struct_type => {
const struct_type = ip.loadStructType(ty.toIntern());