| ... | ... | @@ -534,9 +534,7 @@ pub fn generateSymbol( |
| 534 | 534 | while (index < vector_type.len) : (index += 1) { |
| 535 | 535 | try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(switch (aggregate.storage) { |
| 536 | 536 | .bytes => unreachable, |
| 537 | | .elems => |elems| elems[ |
| 538 | | math.cast(usize, index) orelse return error.Overflow |
| 539 | | ], |
| 537 | .elems => |elems| elems[math.cast(usize, index) orelse return error.Overflow], |
| 540 | 538 | .repeated_elem => |elem| elem, |
| 541 | 539 | }), w, reloc_parent); |
| 542 | 540 | } |
| ... | ... | @@ -551,35 +549,24 @@ pub fn generateSymbol( |
| 551 | 549 | }, |
| 552 | 550 | .tuple_type => |tuple| { |
| 553 | 551 | const struct_begin = w.end; |
| 554 | | for ( |
| 555 | | tuple.types.get(ip), |
| 556 | | tuple.values.get(ip), |
| 557 | | 0.., |
| 558 | | ) |field_ty, comptime_val, index| { |
| 559 | | if (comptime_val != .none) continue; |
| 552 | for (tuple.types.get(ip), tuple.values.get(ip), 0..) |field_ty, field_val, field_index| { |
| 553 | if (field_val != .none) continue; |
| 560 | 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 | 560 | .bytes => |bytes| try pt.intern(.{ .int = .{ |
| 564 | 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 | 565 | .repeated_elem => |elem| elem, |
| 569 | | }; |
| 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 | | } |
| 566 | }), w, reloc_parent); |
| 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 | 571 | .struct_type => { |
| 585 | 572 | const struct_type = ip.loadStructType(ty.toIntern()); |