diff --git a/src/Module.zig b/src/Module.zig index 3bb15e78c3..3243c36ee5 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -531,9 +531,6 @@ pub const Decl = struct { /// What kind of a declaration is this. kind: Kind, - /// TODO remove this once Wasm backend catches up - fn_link: ?link.File.Wasm.FnData = null, - /// The shallow set of other decls whose typed_value could possibly change if this Decl's /// typed_value is modified. dependants: DepsTable = .{}, @@ -5247,11 +5244,6 @@ pub fn clearDecl( if (decl.has_tv) { if (decl.ty.isFnOrHasRuntimeBits()) { mod.comp.bin_file.freeDecl(decl_index); - - decl.fn_link = switch (mod.comp.bin_file.tag) { - .wasm => link.File.Wasm.FnData.empty, - else => null, - }; } if (decl.getInnerNamespace()) |namespace| { try namespace.deleteAllDecls(mod, outdated_decls); @@ -5652,10 +5644,6 @@ pub fn allocateNewDecl( .deletion_flag = false, .zir_decl_index = 0, .src_scope = src_scope, - .fn_link = switch (mod.comp.bin_file.tag) { - .wasm => link.File.Wasm.FnData.empty, - else => null, - }, .generation = 0, .is_pub = false, .is_exported = false, diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index ec494b1a57..7ce6a0482b 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -1194,7 +1194,7 @@ fn genFunc(func: *CodeGen) InnerError!void { const fn_info = func.decl.ty.fnInfo(); var func_type = try genFunctype(func.gpa, fn_info.cc, fn_info.param_types, fn_info.return_type, func.target); defer func_type.deinit(func.gpa); - func.decl.fn_link.?.type_index = try func.bin_file.putOrGetFuncType(func_type); + _ = try func.bin_file.storeDeclType(func.decl_index, func_type); var cc_result = try func.resolveCallingConventionValues(func.decl.ty); defer cc_result.deinit(func.gpa); @@ -2131,12 +2131,12 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif defer func_type.deinit(func.gpa); const atom_index = try func.bin_file.getOrCreateAtomForDecl(extern_fn.data.owner_decl); const atom = func.bin_file.getAtomPtr(atom_index); - ext_decl.fn_link.?.type_index = try func.bin_file.putOrGetFuncType(func_type); + const type_index = try func.bin_file.storeDeclType(extern_fn.data.owner_decl, func_type); try func.bin_file.addOrUpdateImport( mem.sliceTo(ext_decl.name, 0), atom.getSymbolIndex().?, ext_decl.getExternFn().?.lib_name, - ext_decl.fn_link.?.type_index, + type_index, ); break :blk extern_fn.data.owner_decl; } else if (func_val.castTag(.decl_ref)) |decl_ref| { diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 17391b017a..9d20412788 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -46,6 +46,9 @@ host_name: []const u8 = "env", /// List of all `Decl` that are currently alive. /// Each index maps to the corresponding `Atom.Index`. decls: std.AutoHashMapUnmanaged(Module.Decl.Index, Atom.Index) = .{}, +/// Mapping between an `Atom` and its type index representing the Wasm +/// type of the function signature. +atom_types: std.AutoHashMapUnmanaged(Atom.Index, u32) = .{}, /// List of all symbols generated by Zig code. symbols: std.ArrayListUnmanaged(Symbol) = .{}, /// List of symbol indexes which are free to be used. @@ -175,15 +178,6 @@ pub const Segment = struct { offset: u32, }; -pub const FnData = struct { - /// Reference to the wasm type that represents this function. - type_index: u32, - - pub const empty: FnData = .{ - .type_index = undefined, - }; -}; - pub const Export = struct { sym_index: ?u32 = null, }; @@ -961,6 +955,7 @@ pub fn deinit(wasm: *Wasm) void { } wasm.decls.deinit(gpa); + wasm.atom_types.deinit(gpa); wasm.symbols.deinit(gpa); wasm.symbols_free_list.deinit(gpa); wasm.globals.deinit(gpa); @@ -1607,7 +1602,7 @@ const Kind = union(enum) { initialized, synthetic, }, - function: FnData, + function: void, /// Returns the segment name the data kind represents. /// Asserts `kind` has its active tag set to `data`. @@ -1626,12 +1621,13 @@ fn parseAtom(wasm: *Wasm, atom_index: Atom.Index, kind: Kind) !void { const atom = wasm.getAtomPtr(atom_index); const symbol = (SymbolLoc{ .file = null, .index = atom.sym_index }).getSymbol(wasm); const final_index: u32 = switch (kind) { - .function => |fn_data| result: { + .function => result: { const index = @intCast(u32, wasm.functions.count() + wasm.imported_functions_count); + const type_index = wasm.atom_types.get(atom_index).?; try wasm.functions.putNoClobber( wasm.base.allocator, .{ .file = null, .index = index }, - .{ .type_index = fn_data.type_index }, + .{ .type_index = type_index }, ); symbol.tag = .function; symbol.index = index; @@ -2829,7 +2825,7 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod if (decl.isExtern()) continue; const atom_index = entry.value_ptr.*; if (decl.ty.zigTypeTag() == .Fn) { - try wasm.parseAtom(atom_index, .{ .function = decl.fn_link.? }); + try wasm.parseAtom(atom_index, .function); } else if (decl.getVariable()) |variable| { if (!variable.is_mutable) { try wasm.parseAtom(atom_index, .{ .data = .read_only }); @@ -4172,3 +4168,13 @@ pub fn putOrGetFuncType(wasm: *Wasm, func_type: std.wasm.Type) !u32 { }); return index; } + +/// For the given `decl_index`, stores the corresponding type representing the function signature. +/// Asserts declaration has an associated `Atom`. +/// Returns the index into the list of types. +pub fn storeDeclType(wasm: *Wasm, decl_index: Module.Decl.Index, func_type: std.wasm.Type) !u32 { + const atom_index = wasm.decls.get(decl_index).?; + const index = try wasm.putOrGetFuncType(func_type); + try wasm.atom_types.put(wasm.base.allocator, atom_index, index); + return index; +}