authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-31 23:46:39-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:58-07:00
log828756ceebaed09a90da81a5fc9a492443e2e8bb
treec5d2ca56e670558e96fbcc6d9020ef61d7f2ea4e
parent08ae212772c38d6149464274edc07282e5418570

InternPool: fix element pointer type computations


3 files changed, 13 insertions(+), 9 deletions(-)

src/Sema.zig+6-2
......@@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad(
2850828508 .int => return error.RuntimeLoad,
2850928509 .eu_payload, .opt_payload => |container_ptr| blk: {
2851028510 const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod);
28511 const payload_ty = ptr.ty.toType().childType(mod);
28511 const payload_ty = switch (ptr.addr) {
28512 .eu_payload => container_ty.errorUnionPayload(mod),
28513 .opt_payload => container_ty.optionalChild(mod),
28514 else => unreachable,
28515 };
2851228516 var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty);
2851328517
2851428518 // eu_payload and opt_payload never have a well-defined layout
......@@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad(
2855428558 };
2855528559 },
2855628560 .elem => |elem_ptr| blk: {
28557 const elem_ty = ptr.ty.toType().elemType2(mod);
28561 const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
2855828562 var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null);
2855928563
2856028564 // This code assumes that elem_ptrs have been "flattened" in order for direct dereference
src/codegen/llvm.zig+2-1
......@@ -3915,7 +3915,8 @@ pub const DeclGen = struct {
39153915 const indices: [1]*llvm.Value = .{
39163916 llvm_usize.constInt(elem_ptr.index, .False),
39173917 };
3918 const elem_llvm_ty = try dg.lowerType(ptr.ty.toType().elemType2(mod));
3918 const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
3919 const elem_llvm_ty = try dg.lowerType(elem_ty);
39193920 return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len);
39203921 },
39213922 .field => |field_ptr| {
src/value.zig+5-6
......@@ -625,15 +625,14 @@ pub const Value = struct {
625625 .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema),
626626 .elem => |elem| {
627627 const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
628 const elem_size = ptr.ty.toType().elemType2(mod).abiSize(mod);
629 return base_addr + elem.index * elem_size;
628 const elem_ty = mod.intern_pool.typeOf(elem.base).toType().elemType2(mod);
629 return base_addr + elem.index * elem_ty.abiSize(mod);
630630 },
631631 .field => |field| {
632 const struct_ty = ptr.ty.toType().childType(mod);
633 if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
634632 const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
635 const field_offset = ptr.ty.toType().childType(mod).structFieldOffset(field.index, mod);
636 return base_addr + field_offset;
633 const struct_ty = mod.intern_pool.typeOf(field.base).toType().childType(mod);
634 if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
635 return base_addr + struct_ty.structFieldOffset(field.index, mod);
637636 },
638637 else => null,
639638 },