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(...@@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad(
28508 .int => return error.RuntimeLoad,28508 .int => return error.RuntimeLoad,
28509 .eu_payload, .opt_payload => |container_ptr| blk: {28509 .eu_payload, .opt_payload => |container_ptr| blk: {
28510 const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod);28510 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 };
28512 var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty);28516 var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty);
2851328517
28514 // eu_payload and opt_payload never have a well-defined layout28518 // eu_payload and opt_payload never have a well-defined layout
...@@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad(...@@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad(
28554 };28558 };
28555 },28559 },
28556 .elem => |elem_ptr| blk: {28560 .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);
28558 var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null);28562 var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null);
2855928563
28560 // This code assumes that elem_ptrs have been "flattened" in order for direct dereference28564 // 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 {...@@ -3915,7 +3915,8 @@ pub const DeclGen = struct {
3915 const indices: [1]*llvm.Value = .{3915 const indices: [1]*llvm.Value = .{
3916 llvm_usize.constInt(elem_ptr.index, .False),3916 llvm_usize.constInt(elem_ptr.index, .False),
3917 };3917 };
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);
3919 return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len);3920 return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len);
3920 },3921 },
3921 .field => |field_ptr| {3922 .field => |field_ptr| {
src/value.zig+5-6
...@@ -625,15 +625,14 @@ pub const Value = struct {...@@ -625,15 +625,14 @@ pub const Value = struct {
625 .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema),625 .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema),
626 .elem => |elem| {626 .elem => |elem| {
627 const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;627 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);628 const elem_ty = mod.intern_pool.typeOf(elem.base).toType().elemType2(mod);
629 return base_addr + elem.index * elem_size;629 return base_addr + elem.index * elem_ty.abiSize(mod);
630 },630 },
631 .field => |field| {631 .field => |field| {
632 const struct_ty = ptr.ty.toType().childType(mod);
633 if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
634 const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;632 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);633 const struct_ty = mod.intern_pool.typeOf(field.base).toType().childType(mod);
636 return base_addr + field_offset;634 if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
635 return base_addr + struct_ty.structFieldOffset(field.index, mod);
637 },636 },
638 else => null,637 else => null,
639 },638 },