codegen: fix byte-aligned field offsets in unaligned nested packed structs
This commit is contained in:
@@ -10140,6 +10140,7 @@ pub const FuncGen = struct {
|
||||
const result_ty = self.typeOfIndex(inst);
|
||||
const result_ty_info = result_ty.ptrInfo(mod);
|
||||
const struct_ptr_ty_info = struct_ptr_ty.ptrInfo(mod);
|
||||
const struct_type = mod.typeToStruct(struct_ty).?;
|
||||
|
||||
if (result_ty_info.packed_offset.host_size != 0) {
|
||||
// From LLVM's perspective, a pointer to a packed struct and a pointer
|
||||
@@ -10151,7 +10152,7 @@ pub const FuncGen = struct {
|
||||
|
||||
// We have a pointer to a packed struct field that happens to be byte-aligned.
|
||||
// Offset our operand pointer by the correct number of bytes.
|
||||
const byte_offset = struct_ty.packedStructFieldByteOffset(field_index, mod) + @divExact(struct_ptr_ty_info.packed_offset.bit_offset, 8);
|
||||
const byte_offset = @divExact(mod.structPackedFieldBitOffset(struct_type, field_index) + struct_ptr_ty_info.packed_offset.bit_offset, 8);
|
||||
if (byte_offset == 0) return struct_ptr;
|
||||
const usize_ty = try o.lowerType(Type.usize);
|
||||
const llvm_index = try o.builder.intValue(usize_ty, byte_offset);
|
||||
|
||||
Reference in New Issue
Block a user