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