aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-05-25 07:08:48 -0400
committerAndrew Kelley <andrew@ziglang.org>2023-06-10 20:47:55 -0700
commit72e4ea38216aab7e7ed05978d04c5d32de44b5ce (patch)
tree9b11f31d39590a767d420dd036682438a6ede634 /src/value.zig
parent1a4626d2cf8b9985833f97b6fea6ea03011ada4e (diff)
downloadzig-72e4ea38216aab7e7ed05978d04c5d32de44b5ce.tar.gz
zig-72e4ea38216aab7e7ed05978d04c5d32de44b5ce.zip
InternPool: fix crashes up to in progress comptime mutation
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/value.zig b/src/value.zig
index ef3a3f6be1..02f4422dda 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -1961,12 +1961,31 @@ pub const Value = struct {
mod: *Module,
) Allocator.Error!Value {
const elem_ty = ty.elemType2(mod);
+ const ptr_ty_key = mod.intern_pool.indexToKey(ty.toIntern()).ptr_type;
+ assert(ptr_ty_key.host_size == 0);
+ assert(ptr_ty_key.bit_offset == 0);
+ assert(ptr_ty_key.vector_index == .none);
+ const elem_alignment = InternPool.Alignment.fromByteUnits(elem_ty.abiAlignment(mod));
+ const alignment = switch (ptr_ty_key.alignment) {
+ .none => .none,
+ else => ptr_ty_key.alignment.min(
+ @intToEnum(InternPool.Alignment, @ctz(index * elem_ty.abiSize(mod))),
+ ),
+ };
+ const ptr_ty = try mod.ptrType(.{
+ .elem_type = elem_ty.toIntern(),
+ .alignment = if (alignment == elem_alignment) .none else alignment,
+ .is_const = ptr_ty_key.is_const,
+ .is_volatile = ptr_ty_key.is_volatile,
+ .is_allowzero = ptr_ty_key.is_allowzero,
+ .address_space = ptr_ty_key.address_space,
+ });
const ptr_val = switch (mod.intern_pool.indexToKey(val.toIntern())) {
.ptr => |ptr| ptr: {
switch (ptr.addr) {
.elem => |elem| if (mod.intern_pool.typeOf(elem.base).toType().elemType2(mod).eql(elem_ty, mod))
return (try mod.intern(.{ .ptr = .{
- .ty = ty.toIntern(),
+ .ty = ptr_ty.toIntern(),
.addr = .{ .elem = .{
.base = elem.base,
.index = elem.index + index,
@@ -1982,7 +2001,7 @@ pub const Value = struct {
else => val,
};
return (try mod.intern(.{ .ptr = .{
- .ty = ty.toIntern(),
+ .ty = ptr_ty.toIntern(),
.addr = .{ .elem = .{
.base = ptr_val.toIntern(),
.index = index,