| ... | @@ -3537,78 +3537,75 @@ pub const DeclGen = struct { | ... | @@ -3537,78 +3537,75 @@ pub const DeclGen = struct { |
| 3537 | @intCast(c_uint, llvm_elems.len), | 3537 | @intCast(c_uint, llvm_elems.len), |
| 3538 | ); | 3538 | ); |
| 3539 | }, | 3539 | }, |
| 3540 | .struct_type, .anon_struct_type => { | 3540 | .anon_struct_type => |tuple| { |
| 3541 | const llvm_struct_ty = try dg.lowerType(tv.ty); | | |
| 3542 | const gpa = dg.gpa; | 3541 | const gpa = dg.gpa; |
| 3543 | | 3542 | |
| 3544 | const struct_type = switch (mod.intern_pool.indexToKey(tv.ty.toIntern())) { | 3543 | var llvm_fields: std.ArrayListUnmanaged(*llvm.Value) = .{}; |
| 3545 | .anon_struct_type => |tuple| { | 3544 | defer llvm_fields.deinit(gpa); |
| 3546 | var llvm_fields: std.ArrayListUnmanaged(*llvm.Value) = .{}; | | |
| 3547 | defer llvm_fields.deinit(gpa); | | |
| 3548 | | | |
| 3549 | try llvm_fields.ensureUnusedCapacity(gpa, tuple.types.len); | | |
| 3550 | | 3545 | |
| 3551 | comptime assert(struct_layout_version == 2); | 3546 | try llvm_fields.ensureUnusedCapacity(gpa, tuple.types.len); |
| 3552 | var offset: u64 = 0; | | |
| 3553 | var big_align: u32 = 0; | | |
| 3554 | var need_unnamed = false; | | |
| 3555 | | 3547 | |
| 3556 | for (tuple.types, tuple.values, 0..) |field_ty, field_val, i| { | 3548 | comptime assert(struct_layout_version == 2); |
| 3557 | if (field_val != .none) continue; | 3549 | var offset: u64 = 0; |
| 3558 | if (!field_ty.toType().hasRuntimeBitsIgnoreComptime(mod)) continue; | 3550 | var big_align: u32 = 0; |
| | 3551 | var need_unnamed = false; |
| 3559 | | 3552 | |
| 3560 | const field_align = field_ty.toType().abiAlignment(mod); | 3553 | for (tuple.types, tuple.values, 0..) |field_ty, field_val, i| { |
| 3561 | big_align = @max(big_align, field_align); | 3554 | if (field_val != .none) continue; |
| 3562 | const prev_offset = offset; | 3555 | if (!field_ty.toType().hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 3563 | offset = std.mem.alignForwardGeneric(u64, offset, field_align); | | |
| 3564 | | 3556 | |
| 3565 | const padding_len = offset - prev_offset; | 3557 | const field_align = field_ty.toType().abiAlignment(mod); |
| 3566 | if (padding_len > 0) { | 3558 | big_align = @max(big_align, field_align); |
| 3567 | const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len)); | 3559 | const prev_offset = offset; |
| 3568 | // TODO make this and all other padding elsewhere in debug | 3560 | offset = std.mem.alignForwardGeneric(u64, offset, field_align); |
| 3569 | // builds be 0xaa not undef. | | |
| 3570 | llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef()); | | |
| 3571 | } | | |
| 3572 | | 3561 | |
| 3573 | const field_llvm_val = try dg.lowerValue(.{ | 3562 | const padding_len = offset - prev_offset; |
| 3574 | .ty = field_ty.toType(), | 3563 | if (padding_len > 0) { |
| 3575 | .val = try tv.val.fieldValue(mod, i), | 3564 | const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len)); |
| 3576 | }); | 3565 | // TODO make this and all other padding elsewhere in debug |
| | 3566 | // builds be 0xaa not undef. |
| | 3567 | llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef()); |
| | 3568 | } |
| 3577 | | 3569 | |
| 3578 | need_unnamed = need_unnamed or dg.isUnnamedType(field_ty.toType(), field_llvm_val); | 3570 | const field_llvm_val = try dg.lowerValue(.{ |
| | 3571 | .ty = field_ty.toType(), |
| | 3572 | .val = try tv.val.fieldValue(mod, i), |
| | 3573 | }); |
| 3579 | | 3574 | |
| 3580 | llvm_fields.appendAssumeCapacity(field_llvm_val); | 3575 | need_unnamed = need_unnamed or dg.isUnnamedType(field_ty.toType(), field_llvm_val); |
| 3581 | | 3576 | |
| 3582 | offset += field_ty.toType().abiSize(mod); | 3577 | llvm_fields.appendAssumeCapacity(field_llvm_val); |
| 3583 | } | | |
| 3584 | { | | |
| 3585 | const prev_offset = offset; | | |
| 3586 | offset = std.mem.alignForwardGeneric(u64, offset, big_align); | | |
| 3587 | const padding_len = offset - prev_offset; | | |
| 3588 | if (padding_len > 0) { | | |
| 3589 | const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len)); | | |
| 3590 | llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef()); | | |
| 3591 | } | | |
| 3592 | } | | |
| 3593 | | 3578 | |
| 3594 | if (need_unnamed) { | 3579 | offset += field_ty.toType().abiSize(mod); |
| 3595 | return dg.context.constStruct( | 3580 | } |
| 3596 | llvm_fields.items.ptr, | 3581 | { |
| 3597 | @intCast(c_uint, llvm_fields.items.len), | 3582 | const prev_offset = offset; |
| 3598 | .False, | 3583 | offset = std.mem.alignForwardGeneric(u64, offset, big_align); |
| 3599 | ); | 3584 | const padding_len = offset - prev_offset; |
| 3600 | } else { | 3585 | if (padding_len > 0) { |
| 3601 | return llvm_struct_ty.constNamedStruct( | 3586 | const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len)); |
| 3602 | llvm_fields.items.ptr, | 3587 | llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef()); |
| 3603 | @intCast(c_uint, llvm_fields.items.len), | 3588 | } |
| 3604 | ); | 3589 | } |
| 3605 | } | | |
| 3606 | }, | | |
| 3607 | .struct_type => |struct_type| struct_type, | | |
| 3608 | else => unreachable, | | |
| 3609 | }; | | |
| 3610 | | 3590 | |
| | 3591 | if (need_unnamed) { |
| | 3592 | return dg.context.constStruct( |
| | 3593 | llvm_fields.items.ptr, |
| | 3594 | @intCast(c_uint, llvm_fields.items.len), |
| | 3595 | .False, |
| | 3596 | ); |
| | 3597 | } else { |
| | 3598 | const llvm_struct_ty = try dg.lowerType(tv.ty); |
| | 3599 | return llvm_struct_ty.constNamedStruct( |
| | 3600 | llvm_fields.items.ptr, |
| | 3601 | @intCast(c_uint, llvm_fields.items.len), |
| | 3602 | ); |
| | 3603 | } |
| | 3604 | }, |
| | 3605 | .struct_type => |struct_type| { |
| 3611 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; | 3606 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; |
| | 3607 | const llvm_struct_ty = try dg.lowerType(tv.ty); |
| | 3608 | const gpa = dg.gpa; |
| 3612 | | 3609 | |
| 3613 | if (struct_obj.layout == .Packed) { | 3610 | if (struct_obj.layout == .Packed) { |
| 3614 | assert(struct_obj.haveLayout()); | 3611 | assert(struct_obj.haveLayout()); |