| ... | @@ -534,9 +534,7 @@ pub fn generateSymbol( | ... | @@ -534,9 +534,7 @@ pub fn generateSymbol( |
| 534 | while (index < vector_type.len) : (index += 1) { | 534 | while (index < vector_type.len) : (index += 1) { |
| 535 | try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(switch (aggregate.storage) { | 535 | try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(switch (aggregate.storage) { |
| 536 | .bytes => unreachable, | 536 | .bytes => unreachable, |
| 537 | .elems => |elems| elems[ | 537 | .elems => |elems| elems[math.cast(usize, index) orelse return error.Overflow], |
| 538 | math.cast(usize, index) orelse return error.Overflow | | |
| 539 | ], | | |
| 540 | .repeated_elem => |elem| elem, | 538 | .repeated_elem => |elem| elem, |
| 541 | }), w, reloc_parent); | 539 | }), w, reloc_parent); |
| 542 | } | 540 | } |
| ... | @@ -551,35 +549,24 @@ pub fn generateSymbol( | ... | @@ -551,35 +549,24 @@ pub fn generateSymbol( |
| 551 | }, | 549 | }, |
| 552 | .tuple_type => |tuple| { | 550 | .tuple_type => |tuple| { |
| 553 | const struct_begin = w.end; | 551 | const struct_begin = w.end; |
| 554 | for ( | 552 | for (tuple.types.get(ip), tuple.values.get(ip), 0..) |field_ty, field_val, field_index| { |
| 555 | tuple.types.get(ip), | 553 | if (field_val != .none) continue; |
| 556 | tuple.values.get(ip), | | |
| 557 | 0.., | | |
| 558 | ) |field_ty, comptime_val, index| { | | |
| 559 | if (comptime_val != .none) continue; | | |
| 560 | if (!Type.fromInterned(field_ty).hasRuntimeBits(zcu)) continue; | 554 | if (!Type.fromInterned(field_ty).hasRuntimeBits(zcu)) continue; |
| 561 | | 555 | |
| 562 | const field_val = switch (aggregate.storage) { | 556 | try w.splatByteAll(0, math.cast(usize, struct_begin + |
| | 557 | Type.fromInterned(field_ty).abiAlignment(zcu).forward(w.end - struct_begin) - w.end) orelse |
| | 558 | return error.Overflow); |
| | 559 | try generateSymbol(bin_file, pt, src_loc, .fromInterned(switch (aggregate.storage) { |
| 563 | .bytes => |bytes| try pt.intern(.{ .int = .{ | 560 | .bytes => |bytes| try pt.intern(.{ .int = .{ |
| 564 | .ty = field_ty, | 561 | .ty = field_ty, |
| 565 | .storage = .{ .u64 = bytes.at(index, ip) }, | 562 | .storage = .{ .u64 = bytes.at(field_index, ip) }, |
| 566 | } }), | 563 | } }), |
| 567 | .elems => |elems| elems[index], | 564 | .elems => |elems| elems[field_index], |
| 568 | .repeated_elem => |elem| elem, | 565 | .repeated_elem => |elem| elem, |
| 569 | }; | 566 | }), w, reloc_parent); |
| 570 | | | |
| 571 | try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(field_val), w, reloc_parent); | | |
| 572 | const unpadded_field_end = w.end - struct_begin; | | |
| 573 | | | |
| 574 | // Pad struct members if required | | |
| 575 | const padded_field_end = ty.structFieldOffset(index + 1, zcu); | | |
| 576 | const padding = math.cast(usize, padded_field_end - unpadded_field_end) orelse | | |
| 577 | return error.Overflow; | | |
| 578 | | | |
| 579 | if (padding > 0) { | | |
| 580 | try w.splatByteAll(0, padding); | | |
| 581 | } | | |
| 582 | } | 567 | } |
| | 568 | try w.splatByteAll(0, math.cast(usize, struct_begin + ty.abiSize(zcu) - w.end) orelse |
| | 569 | return error.Overflow); |
| 583 | }, | 570 | }, |
| 584 | .struct_type => { | 571 | .struct_type => { |
| 585 | const struct_type = ip.loadStructType(ty.toIntern()); | 572 | const struct_type = ip.loadStructType(ty.toIntern()); |