Commit 828756ceeb

Jacob Young <jacobly0@users.noreply.github.com>
2023-06-01 05:46:39
InternPool: fix element pointer type computations
1 parent 08ae212
Changed files (3)
src/codegen/llvm.zig
@@ -3915,7 +3915,8 @@ pub const DeclGen = struct {
                     const indices: [1]*llvm.Value = .{
                         llvm_usize.constInt(elem_ptr.index, .False),
                     };
-                    const elem_llvm_ty = try dg.lowerType(ptr.ty.toType().elemType2(mod));
+                    const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
+                    const elem_llvm_ty = try dg.lowerType(elem_ty);
                     return elem_llvm_ty.constInBoundsGEP(parent_llvm_ptr, &indices, indices.len);
                 },
                 .field => |field_ptr| {
src/Sema.zig
@@ -28508,7 +28508,11 @@ fn beginComptimePtrLoad(
             .int => return error.RuntimeLoad,
             .eu_payload, .opt_payload => |container_ptr| blk: {
                 const container_ty = mod.intern_pool.typeOf(container_ptr).toType().childType(mod);
-                const payload_ty = ptr.ty.toType().childType(mod);
+                const payload_ty = switch (ptr.addr) {
+                    .eu_payload => container_ty.errorUnionPayload(mod),
+                    .opt_payload => container_ty.optionalChild(mod),
+                    else => unreachable,
+                };
                 var deref = try sema.beginComptimePtrLoad(block, src, container_ptr.toValue(), container_ty);
 
                 // eu_payload and opt_payload never have a well-defined layout
@@ -28554,7 +28558,7 @@ fn beginComptimePtrLoad(
                 };
             },
             .elem => |elem_ptr| blk: {
-                const elem_ty = ptr.ty.toType().elemType2(mod);
+                const elem_ty = mod.intern_pool.typeOf(elem_ptr.base).toType().elemType2(mod);
                 var deref = try sema.beginComptimePtrLoad(block, src, elem_ptr.base.toValue(), null);
 
                 // This code assumes that elem_ptrs have been "flattened" in order for direct dereference
src/value.zig
@@ -625,15 +625,14 @@ pub const Value = struct {
                     .int => |int| int.toValue().getUnsignedIntAdvanced(mod, opt_sema),
                     .elem => |elem| {
                         const base_addr = (try elem.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
-                        const elem_size = ptr.ty.toType().elemType2(mod).abiSize(mod);
-                        return base_addr + elem.index * elem_size;
+                        const elem_ty = mod.intern_pool.typeOf(elem.base).toType().elemType2(mod);
+                        return base_addr + elem.index * elem_ty.abiSize(mod);
                     },
                     .field => |field| {
-                        const struct_ty = ptr.ty.toType().childType(mod);
-                        if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
                         const base_addr = (try field.base.toValue().getUnsignedIntAdvanced(mod, opt_sema)) orelse return null;
-                        const field_offset = ptr.ty.toType().childType(mod).structFieldOffset(field.index, mod);
-                        return base_addr + field_offset;
+                        const struct_ty = mod.intern_pool.typeOf(field.base).toType().childType(mod);
+                        if (opt_sema) |sema| try sema.resolveTypeLayout(struct_ty);
+                        return base_addr + struct_ty.structFieldOffset(field.index, mod);
                     },
                     else => null,
                 },