| ... | ... | @@ -3370,7 +3370,7 @@ pub const DeclGen = struct { |
| 3370 | 3370 | return llvm_int.constIntToPtr(try dg.lowerType(tv.ty)); |
| 3371 | 3371 | }, |
| 3372 | 3372 | .field_ptr, .opt_payload_ptr, .eu_payload_ptr, .elem_ptr => { |
| 3373 | | return dg.lowerParentPtr(tv.val); |
| 3373 | return dg.lowerParentPtr(tv.val, tv.ty.ptrInfo().data.bit_offset % 8 == 0); |
| 3374 | 3374 | }, |
| 3375 | 3375 | .null_value, .zero => { |
| 3376 | 3376 | const llvm_type = try dg.lowerType(tv.ty); |
| ... | ... | @@ -3378,7 +3378,7 @@ pub const DeclGen = struct { |
| 3378 | 3378 | }, |
| 3379 | 3379 | .opt_payload => { |
| 3380 | 3380 | const payload = tv.val.castTag(.opt_payload).?.data; |
| 3381 | | return dg.lowerParentPtr(payload); |
| 3381 | return dg.lowerParentPtr(payload, tv.ty.ptrInfo().data.bit_offset % 8 == 0); |
| 3382 | 3382 | }, |
| 3383 | 3383 | else => |tag| return dg.todo("implement const of pointer type '{}' ({})", .{ |
| 3384 | 3384 | tv.ty.fmtDebug(), tag, |
| ... | ... | @@ -3967,7 +3967,7 @@ pub const DeclGen = struct { |
| 3967 | 3967 | return try dg.lowerDeclRefValue(.{ .ty = ptr_ty, .val = ptr_val }, decl_index); |
| 3968 | 3968 | } |
| 3969 | 3969 | |
| 3970 | | fn lowerParentPtr(dg: *DeclGen, ptr_val: Value) Error!*llvm.Value { |
| 3970 | fn lowerParentPtr(dg: *DeclGen, ptr_val: Value, byte_aligned: bool) Error!*llvm.Value { |
| 3971 | 3971 | const target = dg.module.getTarget(); |
| 3972 | 3972 | switch (ptr_val.tag()) { |
| 3973 | 3973 | .decl_ref_mut => { |
| ... | ... | @@ -3996,7 +3996,7 @@ pub const DeclGen = struct { |
| 3996 | 3996 | }, |
| 3997 | 3997 | .field_ptr => { |
| 3998 | 3998 | const field_ptr = ptr_val.castTag(.field_ptr).?.data; |
| 3999 | | const parent_llvm_ptr = try dg.lowerParentPtr(field_ptr.container_ptr); |
| 3999 | const parent_llvm_ptr = try dg.lowerParentPtr(field_ptr.container_ptr, byte_aligned); |
| 4000 | 4000 | const parent_ty = field_ptr.container_ty; |
| 4001 | 4001 | |
| 4002 | 4002 | const field_index = @intCast(u32, field_ptr.field_index); |
| ... | ... | @@ -4026,6 +4026,7 @@ pub const DeclGen = struct { |
| 4026 | 4026 | }, |
| 4027 | 4027 | .Struct => { |
| 4028 | 4028 | if (parent_ty.containerLayout() == .Packed) { |
| 4029 | if (!byte_aligned) return parent_llvm_ptr; |
| 4029 | 4030 | const llvm_usize = dg.context.intType(target.cpu.arch.ptrBitWidth()); |
| 4030 | 4031 | const base_addr = parent_llvm_ptr.constPtrToInt(llvm_usize); |
| 4031 | 4032 | // count bits of fields before this one |
| ... | ... | @@ -4072,7 +4073,7 @@ pub const DeclGen = struct { |
| 4072 | 4073 | }, |
| 4073 | 4074 | .elem_ptr => { |
| 4074 | 4075 | const elem_ptr = ptr_val.castTag(.elem_ptr).?.data; |
| 4075 | | const parent_llvm_ptr = try dg.lowerParentPtr(elem_ptr.array_ptr); |
| 4076 | const parent_llvm_ptr = try dg.lowerParentPtr(elem_ptr.array_ptr, true); |
| 4076 | 4077 | |
| 4077 | 4078 | const llvm_usize = try dg.lowerType(Type.usize); |
| 4078 | 4079 | const indices: [1]*llvm.Value = .{ |
| ... | ... | @@ -4083,7 +4084,7 @@ pub const DeclGen = struct { |
| 4083 | 4084 | }, |
| 4084 | 4085 | .opt_payload_ptr => { |
| 4085 | 4086 | const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; |
| 4086 | | const parent_llvm_ptr = try dg.lowerParentPtr(opt_payload_ptr.container_ptr); |
| 4087 | const parent_llvm_ptr = try dg.lowerParentPtr(opt_payload_ptr.container_ptr, true); |
| 4087 | 4088 | var buf: Type.Payload.ElemType = undefined; |
| 4088 | 4089 | |
| 4089 | 4090 | const payload_ty = opt_payload_ptr.container_ty.optionalChild(&buf); |
| ... | ... | @@ -4105,7 +4106,7 @@ pub const DeclGen = struct { |
| 4105 | 4106 | }, |
| 4106 | 4107 | .eu_payload_ptr => { |
| 4107 | 4108 | const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data; |
| 4108 | | const parent_llvm_ptr = try dg.lowerParentPtr(eu_payload_ptr.container_ptr); |
| 4109 | const parent_llvm_ptr = try dg.lowerParentPtr(eu_payload_ptr.container_ptr, true); |
| 4109 | 4110 | |
| 4110 | 4111 | const payload_ty = eu_payload_ptr.container_ty.errorUnionPayload(); |
| 4111 | 4112 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) { |