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