mirror of
https://github.com/ziglang/zig.git
synced 2025-12-29 09:33:18 +00:00
InternPool: fix element pointer type computations
This commit is contained in:
parent
08ae212772
commit
828756ceeb
@ -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
|
||||
|
||||
@ -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| {
|
||||
|
||||
@ -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,
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user