| ... | @@ -5149,6 +5149,11 @@ pub const FuncGen = struct { | ... | @@ -5149,6 +5149,11 @@ pub const FuncGen = struct { |
| 5149 | const same_size_int = self.context.intType(elem_bits); | 5149 | const same_size_int = self.context.intType(elem_bits); |
| 5150 | const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, ""); | 5150 | const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, ""); |
| 5151 | return self.builder.buildBitCast(truncated_int, elem_llvm_ty, ""); | 5151 | return self.builder.buildBitCast(truncated_int, elem_llvm_ty, ""); |
| | 5152 | } else if (field_ty.zigTypeTag() == .Pointer) { |
| | 5153 | const elem_bits = @intCast(c_uint, field_ty.bitSize(target)); |
| | 5154 | const same_size_int = self.context.intType(elem_bits); |
| | 5155 | const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, ""); |
| | 5156 | return self.builder.buildIntToPtr(truncated_int, elem_llvm_ty, ""); |
| 5152 | } | 5157 | } |
| 5153 | return self.builder.buildTrunc(shifted_value, elem_llvm_ty, ""); | 5158 | return self.builder.buildTrunc(shifted_value, elem_llvm_ty, ""); |
| 5154 | }, | 5159 | }, |
| ... | @@ -7999,7 +8004,10 @@ pub const FuncGen = struct { | ... | @@ -7999,7 +8004,10 @@ pub const FuncGen = struct { |
| 7999 | const non_int_val = try self.resolveInst(elem); | 8004 | const non_int_val = try self.resolveInst(elem); |
| 8000 | const ty_bit_size = @intCast(u16, field.ty.bitSize(target)); | 8005 | const ty_bit_size = @intCast(u16, field.ty.bitSize(target)); |
| 8001 | const small_int_ty = self.dg.context.intType(ty_bit_size); | 8006 | const small_int_ty = self.dg.context.intType(ty_bit_size); |
| 8002 | const small_int_val = self.builder.buildBitCast(non_int_val, small_int_ty, ""); | 8007 | const small_int_val = if (field.ty.zigTypeTag() == .Pointer) |
| | 8008 | self.builder.buildPtrToInt(non_int_val, small_int_ty, "") |
| | 8009 | else |
| | 8010 | self.builder.buildBitCast(non_int_val, small_int_ty, ""); |
| 8003 | const shift_rhs = int_llvm_ty.constInt(running_bits, .False); | 8011 | const shift_rhs = int_llvm_ty.constInt(running_bits, .False); |
| 8004 | // If the field is as large as the entire packed struct, this | 8012 | // If the field is as large as the entire packed struct, this |
| 8005 | // zext would go from, e.g. i16 to i16. This is legal with | 8013 | // zext would go from, e.g. i16 to i16. This is legal with |