aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2024-03-25 19:02:21 +0000
committermlugg <mlugg@mlugg.co.uk>2024-03-26 13:48:06 +0000
commitc6f3e9d79cf849623e6c4f25e02e17cdfab07b7c (patch)
tree0efc0142dd23a67509015113b9e1a3aaa2d6c15a /src/Module.zig
parent341857e5cd4fd4453cf9c7d1a6679feb66710d84 (diff)
downloadzig-c6f3e9d79cf849623e6c4f25e02e17cdfab07b7c.tar.gz
zig-c6f3e9d79cf849623e6c4f25e02e17cdfab07b7c.zip
Zcu.Decl: remove `ty` field
`Decl` can no longer store un-interned values, so this field is now unnecessary. The type can instead be fetched with the new `typeOf` helper method, which just gets the type of the Decl's `Value`.
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig51
1 files changed, 25 insertions, 26 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 7d91ceb7d1..9cbb2cc89a 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -330,9 +330,6 @@ const ValueArena = struct {
pub const Decl = struct {
name: InternPool.NullTerminatedString,
- /// The most recent Type of the Decl after a successful semantic analysis.
- /// Populated when `has_tv`.
- ty: Type,
/// The most recent Value of the Decl after a successful semantic analysis.
/// Populated when `has_tv`.
val: Value,
@@ -487,20 +484,28 @@ pub const Decl = struct {
zcu.namespacePtr(decl.src_namespace).fullyQualifiedName(zcu, decl.name);
}
- pub fn typedValue(decl: Decl) error{AnalysisFail}!TypedValue {
+ pub fn typeOf(decl: Decl, zcu: *const Zcu) Type {
+ assert(decl.has_tv);
+ return Type.fromInterned(zcu.intern_pool.typeOf(decl.val.toIntern()));
+ }
+
+ pub fn typedValue(decl: Decl, zcu: *const Zcu) error{AnalysisFail}!TypedValue {
if (!decl.has_tv) return error.AnalysisFail;
- return TypedValue{ .ty = decl.ty, .val = decl.val };
+ return .{
+ .ty = decl.typeOf(zcu),
+ .val = decl.val,
+ };
}
pub fn internValue(decl: *Decl, zcu: *Zcu) Allocator.Error!InternPool.Index {
assert(decl.has_tv);
- const ip_index = try decl.val.intern(decl.ty, zcu);
+ const ip_index = try decl.val.intern(decl.typeOf(zcu), zcu);
decl.val = Value.fromInterned(ip_index);
return ip_index;
}
pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool {
- const tv = try decl.typedValue();
+ const tv = try decl.typedValue(zcu);
return tv.ty.zigTypeTag(zcu) == .Fn;
}
@@ -590,7 +595,7 @@ pub const Decl = struct {
@tagName(decl.analysis),
});
if (decl.has_tv) {
- std.debug.print(" ty={} val={}", .{ decl.ty, decl.val });
+ std.debug.print(" val={}", .{decl.val});
}
std.debug.print("\n", .{});
}
@@ -615,7 +620,7 @@ pub const Decl = struct {
pub fn getAlignment(decl: Decl, zcu: *Zcu) Alignment {
assert(decl.has_tv);
if (decl.alignment != .none) return decl.alignment;
- return decl.ty.abiAlignment(zcu);
+ return decl.typeOf(zcu).abiAlignment(zcu);
}
/// Upgrade a `LazySrcLoc` to a `SrcLoc` based on the `Decl` provided.
@@ -3525,7 +3530,6 @@ fn semaFile(mod: *Module, file: *File) SemaError!void {
new_decl.src_line = 0;
new_decl.is_pub = true;
new_decl.is_exported = false;
- new_decl.ty = Type.type;
new_decl.alignment = .none;
new_decl.@"linksection" = .none;
new_decl.alive = true; // This Decl corresponds to a File and is therefore always alive.
@@ -3594,7 +3598,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
const old_has_tv = decl.has_tv;
// The following values are ignored if `!old_has_tv`
- const old_ty = decl.ty;
+ const old_ty = decl.typeOf(mod);
const old_val = decl.val;
const old_align = decl.alignment;
const old_linksection = decl.@"linksection";
@@ -3716,7 +3720,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
return sema.fail(&block_scope, ty_src, "type {} has no namespace", .{ty.fmt(mod)});
}
- decl.ty = Type.fromInterned(InternPool.Index.type_type);
decl.val = ty.toValue();
decl.alignment = .none;
decl.@"linksection" = .none;
@@ -3760,7 +3763,6 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
},
}
- decl.ty = decl_tv.ty;
decl.val = Value.fromInterned((try decl_tv.val.intern(decl_tv.ty, mod)));
// Function linksection, align, and addrspace were already set by Sema
if (!is_func) {
@@ -3806,10 +3808,10 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
decl.analysis = .complete;
const result: SemaDeclResult = if (old_has_tv) .{
- .invalidate_decl_val = !decl.ty.eql(old_ty, mod) or
- !decl.val.eql(old_val, decl.ty, mod) or
+ .invalidate_decl_val = !decl_tv.ty.eql(old_ty, mod) or
+ !decl.val.eql(old_val, decl_tv.ty, mod) or
is_inline != old_is_inline,
- .invalidate_decl_ref = !decl.ty.eql(old_ty, mod) or
+ .invalidate_decl_ref = !decl_tv.ty.eql(old_ty, mod) or
decl.alignment != old_align or
decl.@"linksection" != old_linksection or
decl.@"addrspace" != old_addrspace or
@@ -3819,11 +3821,11 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
.invalidate_decl_ref = true,
};
- const has_runtime_bits = queue_linker_work and (is_func or try sema.typeHasRuntimeBits(decl.ty));
+ const has_runtime_bits = queue_linker_work and (is_func or try sema.typeHasRuntimeBits(decl_tv.ty));
if (has_runtime_bits) {
// Needed for codegen_decl which will call updateDecl and then the
// codegen backend wants full access to the Decl Type.
- try sema.resolveTypeFully(decl.ty);
+ try sema.resolveTypeFully(decl_tv.ty);
try mod.comp.work_queue.writeItem(.{ .codegen_decl = decl_index });
@@ -3850,7 +3852,7 @@ fn semaAnonOwnerDecl(zcu: *Zcu, decl_index: Decl.Index) !SemaDeclResult {
log.debug("semaAnonOwnerDecl '{d}'", .{@intFromEnum(decl_index)});
- switch (decl.ty.zigTypeTag(zcu)) {
+ switch (decl.typeOf(zcu).zigTypeTag(zcu)) {
.Fn => @panic("TODO: update fn instance"),
.Type => {},
else => unreachable,
@@ -4479,7 +4481,7 @@ pub fn finalizeAnonDecl(mod: *Module, decl_index: Decl.Index) Allocator.Error!vo
// if the Decl is referenced by an instruction or another constant. Otherwise,
// the Decl will be garbage collected by the `codegen_decl` task instead of sent
// to the linker.
- if (mod.declPtr(decl_index).ty.isFnOrHasRuntimeBits(mod)) {
+ if (mod.declPtr(decl_index).typeOf(mod).isFnOrHasRuntimeBits(mod)) {
try mod.comp.anon_work_queue.writeItem(.{ .codegen_decl = decl_index });
}
}
@@ -4563,7 +4565,7 @@ pub fn analyzeFnBody(mod: *Module, func_index: InternPool.Index, arena: Allocato
// the runtime-known parameters only, not to be confused with the
// generic_owner function type, which potentially has more parameters,
// including comptime parameters.
- const fn_ty = decl.ty;
+ const fn_ty = decl.typeOf(mod);
const fn_ty_info = mod.typeToFunc(fn_ty).?;
var sema: Sema = .{
@@ -4812,7 +4814,6 @@ pub fn allocateNewDecl(
.src_line = undefined,
.has_tv = false,
.owns_tv = false,
- .ty = undefined,
.val = undefined,
.alignment = undefined,
.@"linksection" = .none,
@@ -4889,7 +4890,6 @@ pub fn initNewAnonDecl(
new_decl.name = name;
new_decl.src_line = src_line;
- new_decl.ty = typed_value.ty;
new_decl.val = typed_value.val;
new_decl.alignment = .none;
new_decl.@"linksection" = .none;
@@ -5419,7 +5419,7 @@ pub fn populateTestFunctions(
try mod.ensureDeclAnalyzed(decl_index);
}
const decl = mod.declPtr(decl_index);
- const test_fn_ty = decl.ty.slicePtrFieldType(mod).childType(mod);
+ const test_fn_ty = decl.typeOf(mod).slicePtrFieldType(mod).childType(mod);
const array_decl_index = d: {
// Add mod.test_functions to an array decl then make the test_functions
@@ -5463,7 +5463,7 @@ pub fn populateTestFunctions(
// func
try mod.intern(.{ .ptr = .{
.ty = try mod.intern(.{ .ptr_type = .{
- .child = test_decl.ty.toIntern(),
+ .child = test_decl.typeOf(mod).toIntern(),
.flags = .{
.is_const = true,
},
@@ -5515,7 +5515,6 @@ pub fn populateTestFunctions(
// Since we are replacing the Decl's value we must perform cleanup on the
// previous value.
- decl.ty = new_ty;
decl.val = new_val;
decl.has_tv = true;
}