diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2025-11-03 22:33:10 -0500 |
|---|---|---|
| committer | Jacob Young <15544577+jacobly0@users.noreply.github.com> | 2025-11-04 06:04:30 -0500 |
| commit | 459f3b7edef14da7d9ec29a77329601469f08b36 (patch) | |
| tree | 561fb06a0b68bc2ac652aae3ea0ec034882fc828 /src/codegen.zig | |
| parent | ea76946d2af588d135e79a97f19d128acfeb8915 (diff) | |
| download | zig-459f3b7edef14da7d9ec29a77329601469f08b36.tar.gz zig-459f3b7edef14da7d9ec29a77329601469f08b36.zip | |
codegen: fix tuple padding
Closes #25797
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 37 |
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()); |
