From 0d8c7ae0078e970af39a3be760f25c51829b44f9 Mon Sep 17 00:00:00 2001 From: mlugg Date: Tue, 26 Mar 2024 04:19:50 +0000 Subject: [PATCH] Zcu.Decl: replace `typedValue` with `valueOrFail` Now that the legacy `Value` representation is eliminated, we can begin to phase out the redundant `TypedValue` type. --- src/Module.zig | 14 ++++---------- src/Sema.zig | 30 +++++++++++++----------------- src/codegen/llvm.zig | 2 +- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/Module.zig b/src/Module.zig index 419205c30f..6f65cf8d2e 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -480,17 +480,11 @@ pub const Decl = struct { return decl.val.typeOf(zcu); } - pub fn typedValue(decl: Decl, zcu: *const Zcu) error{AnalysisFail}!TypedValue { + /// Small wrapper for Sema to use over direct access to the `val` field. + /// If the value is not populated, instead returns `error.AnalysisFail`. + pub fn valueOrFail(decl: Decl) error{AnalysisFail}!Value { if (!decl.has_tv) return error.AnalysisFail; - return .{ - .ty = decl.typeOf(zcu), - .val = decl.val, - }; - } - - pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool { - const tv = try decl.typedValue(zcu); - return tv.ty.zigTypeTag(zcu) == .Fn; + return decl.val; } /// If the Decl owns its value and it is a struct, return it, diff --git a/src/Sema.zig b/src/Sema.zig index 436715d54d..0ff162ed2a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -26660,13 +26660,12 @@ fn prepareSimplePanic(sema: *Sema, block: *Block) !void { // decl_index may be an alias; we must find the decl that actually // owns the function. try sema.ensureDeclAnalyzed(decl_index); - const tv = try mod.declPtr(decl_index).typedValue(mod); + const fn_val = try mod.declPtr(decl_index).valueOrFail(); try sema.declareDependency(.{ .decl_val = decl_index }); - assert(tv.ty.zigTypeTag(mod) == .Fn); - assert(try sema.fnHasRuntimeBits(tv.ty)); - const func_index = tv.val.toIntern(); - try mod.ensureFuncBodyAnalysisQueued(func_index); - mod.panic_func_index = func_index; + assert(fn_val.typeOf(mod).zigTypeTag(mod) == .Fn); + assert(try sema.fnHasRuntimeBits(fn_val.typeOf(mod))); + try mod.ensureFuncBodyAnalysisQueued(fn_val.toIntern()); + mod.panic_func_index = fn_val.toIntern(); } if (mod.null_stack_trace == .none) { @@ -32449,8 +32448,8 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn const mod = sema.mod; try sema.ensureDeclAnalyzed(decl_index); - const decl_tv = try mod.declPtr(decl_index).typedValue(mod); - const owner_decl = mod.declPtr(switch (mod.intern_pool.indexToKey(decl_tv.val.toIntern())) { + const decl_val = try mod.declPtr(decl_index).valueOrFail(); + const owner_decl = mod.declPtr(switch (mod.intern_pool.indexToKey(decl_val.toIntern())) { .variable => |variable| variable.decl, .extern_func => |extern_func| extern_func.decl, .func => |func| func.owner_decl, @@ -32459,10 +32458,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn // TODO: if this is a `decl_ref` of a non-variable decl, only depend on decl type try sema.declareDependency(.{ .decl_val = decl_index }); const ptr_ty = try sema.ptrType(.{ - .child = decl_tv.ty.toIntern(), + .child = decl_val.typeOf(mod).toIntern(), .flags = .{ .alignment = owner_decl.alignment, - .is_const = if (decl_tv.val.getVariable(mod)) |variable| variable.is_const else true, + .is_const = if (decl_val.getVariable(mod)) |variable| variable.is_const else true, .address_space = owner_decl.@"addrspace", }, }); @@ -32478,12 +32477,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: InternPool.DeclIndex) !void { const mod = sema.mod; const decl = mod.declPtr(decl_index); - const tv = try decl.typedValue(mod); - if (tv.ty.zigTypeTag(mod) != .Fn) return; - if (!try sema.fnHasRuntimeBits(tv.ty)) return; - const func_index = tv.val.toIntern(); - if (!mod.intern_pool.isFuncBody(func_index)) return; // undef or extern function - try mod.ensureFuncBodyAnalysisQueued(func_index); + const decl_val = try decl.valueOrFail(); + if (!mod.intern_pool.isFuncBody(decl_val.toIntern())) return; + if (!try sema.fnHasRuntimeBits(decl_val.typeOf(mod))) return; + try mod.ensureFuncBodyAnalysisQueued(decl_val.toIntern()); } fn analyzeRef( @@ -39049,7 +39046,6 @@ fn sliceToIpString( reason: NeededComptimeReason, ) CompileError!InternPool.NullTerminatedString { const zcu = sema.mod; - const ip = &zcu.intern_pool; const slice_ty = slice_val.typeOf(zcu); assert(slice_ty.isSlice(zcu)); assert(slice_ty.childType(zcu).toIntern() == .u8_type); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 421c767bd8..f4d91c2ebb 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1762,7 +1762,7 @@ pub const Object = struct { const decl_name = decl_name: { const decl_name = mod.intern_pool.stringToSlice(decl.name); - if (mod.getTarget().isWasm() and try decl.isFunction(mod)) { + if (mod.getTarget().isWasm() and decl.val.typeOf(mod).zigTypeTag(mod) == .Fn) { if (mod.intern_pool.stringToSliceUnwrap(decl.getOwnedExternFunc(mod).?.lib_name)) |lib_name| { if (!std.mem.eql(u8, lib_name, "c")) { break :decl_name try self.builder.strtabStringFmt("{s}|{s}", .{ decl_name, lib_name });