| ... | ... | @@ -2982,13 +2982,13 @@ pub const Object = struct { |
| 2982 | 2982 | } else .normal; |
| 2983 | 2983 | |
| 2984 | 2984 | const payload_ty = ty: { |
| 2985 | | if (layout.most_aligned_field_size == layout.payload_size) { |
| 2986 | | break :ty aligned_field_llvm_ty; |
| 2987 | | } |
| 2988 | 2985 | const padding_len = if (layout.tag_size == 0) |
| 2989 | 2986 | layout.abi_size - layout.most_aligned_field_size |
| 2990 | 2987 | else |
| 2991 | 2988 | layout.payload_size - layout.most_aligned_field_size; |
| 2989 | if (padding_len == 0) { |
| 2990 | break :ty aligned_field_llvm_ty; |
| 2991 | } |
| 2992 | 2992 | break :ty try o.builder.structType(.@"packed", &.{ |
| 2993 | 2993 | aligned_field_llvm_ty, |
| 2994 | 2994 | try o.builder.arrayType(padding_len, .i8), |
| ... | ... | @@ -3582,6 +3582,11 @@ pub const Object = struct { |
| 3582 | 3582 | const payload = if (un.tag != .none) p: { |
| 3583 | 3583 | const field_index = zcu.unionTagFieldIndex(union_obj, Value.fromInterned(un.tag)).?; |
| 3584 | 3584 | const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_index]); |
| 3585 | const field_size = field_ty.abiSize(zcu); |
| 3586 | const padding_len = if (layout.tag_size == 0) |
| 3587 | layout.abi_size - field_size |
| 3588 | else |
| 3589 | layout.payload_size - field_size; |
| 3585 | 3590 | |
| 3586 | 3591 | // Sometimes we must make an unnamed struct because LLVM does |
| 3587 | 3592 | // not support bitcasting our payload struct to the true union payload type. |
| ... | ... | @@ -3590,7 +3595,6 @@ pub const Object = struct { |
| 3590 | 3595 | need_unnamed = layout.most_aligned_field != field_index; |
| 3591 | 3596 | |
| 3592 | 3597 | if (!field_ty.hasRuntimeBits(zcu)) { |
| 3593 | | const padding_len = layout.payload_size; |
| 3594 | 3598 | break :p try o.builder.undefConst(try o.builder.arrayType(padding_len, .i8)); |
| 3595 | 3599 | } |
| 3596 | 3600 | const payload = try o.lowerValue(un.val, repr); |
| ... | ... | @@ -3598,9 +3602,7 @@ pub const Object = struct { |
| 3598 | 3602 | if (payload_ty != union_ty.structFields(&o.builder)[ |
| 3599 | 3603 | @intFromBool(layout.tag_size > 0 and layout.tag_align.compare(.gte, layout.payload_align)) |
| 3600 | 3604 | ]) need_unnamed = true; |
| 3601 | | const field_size = field_ty.abiSize(zcu); |
| 3602 | | if (field_size == layout.payload_size) break :p payload; |
| 3603 | | const padding_len = layout.payload_size - field_size; |
| 3605 | if (padding_len == 0) break :p payload; |
| 3604 | 3606 | const padding_ty = try o.builder.arrayType(padding_len, .i8); |
| 3605 | 3607 | break :p try o.builder.structConst( |
| 3606 | 3608 | try o.builder.structType(.@"packed", &.{ payload_ty, padding_ty }), |