diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/InternPool.zig | 8 | ||||
| -rw-r--r-- | src/arch/wasm/Emit.zig | 14 | ||||
| -rw-r--r-- | src/link/Wasm.zig | 30 |
3 files changed, 41 insertions, 11 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig index 2a21be9bbe..a43c5a7d3a 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -621,6 +621,14 @@ pub const Nav = struct { } /// Asserts that `status == .resolved`. + pub fn toExtern(nav: *const Nav, ip: *const InternPool) ?Key.Extern { + return switch (ip.indexToKey(nav.status.resolved.val)) { + .@"extern" => |ext| ext, + else => null, + }; + } + + /// Asserts that `status == .resolved`. pub fn isThreadLocal(nav: Nav, ip: *const InternPool) bool { const val = nav.status.resolved.val; if (!isVariable(ip, val)) return false; diff --git a/src/arch/wasm/Emit.zig b/src/arch/wasm/Emit.zig index cb9fbd2ef0..f115eaa144 100644 --- a/src/arch/wasm/Emit.zig +++ b/src/arch/wasm/Emit.zig @@ -30,7 +30,6 @@ pub fn lowerToCode(emit: *Emit) Error!void { const is_obj = comp.config.output_mode == .Obj; const target = &comp.root_mod.resolved_target.result; const is_wasm32 = target.cpu.arch == .wasm32; - const function_imports_len: u32 = @intCast(wasm.function_imports.entries.len); const tags = mir.instruction_tags; const datas = mir.instruction_datas; @@ -159,8 +158,7 @@ pub fn lowerToCode(emit: *Emit) Error!void { }); code.appendNTimesAssumeCapacity(0, 5); } else { - const func_index = Wasm.FunctionIndex.fromIpNav(wasm, datas[inst].nav_index).?; - leb.writeUleb128(code.fixedWriter(), function_imports_len + @intFromEnum(func_index)) catch unreachable; + appendOutputFunctionIndex(code, .fromIpNav(wasm, datas[inst].nav_index)); } inst += 1; @@ -200,8 +198,7 @@ pub fn lowerToCode(emit: *Emit) Error!void { }); code.appendNTimesAssumeCapacity(0, 5); } else { - const func_index = Wasm.FunctionIndex.fromTagNameType(wasm, datas[inst].ip_index).?; - leb.writeUleb128(code.fixedWriter(), function_imports_len + @intFromEnum(func_index)) catch unreachable; + appendOutputFunctionIndex(code, .fromTagNameType(wasm, datas[inst].ip_index)); } inst += 1; @@ -225,8 +222,7 @@ pub fn lowerToCode(emit: *Emit) Error!void { }); code.appendNTimesAssumeCapacity(0, 5); } else { - const func_index = Wasm.FunctionIndex.fromSymbolName(wasm, symbol_name).?; - leb.writeUleb128(code.fixedWriter(), function_imports_len + @intFromEnum(func_index)) catch unreachable; + appendOutputFunctionIndex(code, .fromSymbolName(wasm, symbol_name)); } inst += 1; @@ -978,3 +974,7 @@ fn navRefOff(wasm: *Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir.NavRefOff } } } + +fn appendOutputFunctionIndex(code: *std.ArrayListUnmanaged(u8), i: Wasm.OutputFunctionIndex) void { + leb.writeUleb128(code.fixedWriter(), @intFromEnum(i)) catch unreachable; +} diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 39f8fab20d..bfb6b7a033 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -283,10 +283,6 @@ pub const FunctionIndex = enum(u32) { return &wasm.functions.keys()[@intFromEnum(index)]; } - pub fn toOutputFunctionIndex(index: FunctionIndex, wasm: *const Wasm) OutputFunctionIndex { - return @enumFromInt(wasm.function_imports.entries.len + @intFromEnum(index)); - } - pub fn fromIpNav(wasm: *const Wasm, nav_index: InternPool.Nav.Index) ?FunctionIndex { return fromResolution(wasm, .fromIpNav(wasm, nav_index)); } @@ -324,6 +320,31 @@ pub const GlobalExport = extern struct { /// `flush`. pub const OutputFunctionIndex = enum(u32) { _, + + pub fn fromFunctionIndex(wasm: *const Wasm, index: FunctionIndex) OutputFunctionIndex { + return @enumFromInt(wasm.function_imports.entries.len + @intFromEnum(index)); + } + + pub fn fromIpNav(wasm: *const Wasm, nav_index: InternPool.Nav.Index) OutputFunctionIndex { + const zcu = wasm.base.comp.zcu.?; + const ip = &zcu.intern_pool; + const nav = ip.getNav(nav_index); + if (nav.toExtern(ip)) |ext| { + const name = wasm.getExistingString(ext.name.toSlice(ip)).?; + if (wasm.function_imports.getIndex(name)) |i| return @enumFromInt(i); + return fromFunctionIndex(wasm, FunctionIndex.fromSymbolName(wasm, name).?); + } else { + return fromFunctionIndex(wasm, FunctionIndex.fromIpNav(wasm, nav_index).?); + } + } + + pub fn fromTagNameType(wasm: *const Wasm, tag_type: InternPool.Index) OutputFunctionIndex { + return fromFunctionIndex(wasm, FunctionIndex.fromTagNameType(wasm, tag_type).?); + } + + pub fn fromSymbolName(wasm: *const Wasm, name: String) OutputFunctionIndex { + return fromFunctionIndex(wasm, FunctionIndex.fromSymbolName(wasm, name).?); + } }; /// Index into `Wasm.globals`. @@ -788,6 +809,7 @@ pub const FunctionImport = extern struct { const zcu = wasm.base.comp.zcu.?; const ip = &zcu.intern_pool; const nav = ip.getNav(nav_index); + //log.debug("Resolution.fromIpNav {}({})", .{ nav.fqn.fmt(ip), nav_index }); return pack(wasm, .{ .zcu_func = @enumFromInt(wasm.zcu_funcs.getIndex(nav.status.resolved.val).?), }); |
