diff options
Diffstat (limited to 'src/arch/wasm/CodeGen.zig')
| -rw-r--r-- | src/arch/wasm/CodeGen.zig | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index 5440147296..361fd96374 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -1286,8 +1286,9 @@ fn genFunc(func: *CodeGen) InnerError!void { var prologue = std.ArrayList(Mir.Inst).init(func.gpa); defer prologue.deinit(); + const sp = @intFromEnum(func.bin_file.zigObjectPtr().?.stack_pointer_sym); // load stack pointer - try prologue.append(.{ .tag = .global_get, .data = .{ .label = 0 } }); + try prologue.append(.{ .tag = .global_get, .data = .{ .label = sp } }); // store stack pointer so we can restore it when we return from the function try prologue.append(.{ .tag = .local_tee, .data = .{ .label = func.initial_stack_value.local.value } }); // get the total stack size @@ -1303,7 +1304,7 @@ fn genFunc(func: *CodeGen) InnerError!void { try prologue.append(.{ .tag = .local_tee, .data = .{ .label = func.bottom_stack_value.local.value } }); // Store the current stack pointer value into the global stack pointer so other function calls will // start from this value instead and not overwrite the current stack. - try prologue.append(.{ .tag = .global_set, .data = .{ .label = 0 } }); + try prologue.append(.{ .tag = .global_set, .data = .{ .label = sp } }); // reserve space and insert all prologue instructions at the front of the instruction list // We insert them in reserve order as there is no insertSlice in multiArrayList. @@ -1502,7 +1503,7 @@ fn restoreStackPointer(func: *CodeGen) !void { try func.emitWValue(func.initial_stack_value); // save its value in the global stack pointer - try func.addLabel(.global_set, 0); + try func.addLabel(.global_set, @intFromEnum(func.bin_file.zigObjectPtr().?.stack_pointer_sym)); } /// From a given type, will create space on the virtual stack to store the value of such type. @@ -2205,7 +2206,7 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif const type_index = try func.bin_file.storeDeclType(extern_func.decl, func_type); try func.bin_file.addOrUpdateImport( mod.intern_pool.stringToSlice(ext_decl.name), - atom.getSymbolIndex().?, + atom.sym_index, mod.intern_pool.stringToSliceUnwrap(ext_decl.getOwnedExternFunc(mod).?.lib_name), type_index, ); @@ -2240,7 +2241,7 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif if (callee) |direct| { const atom_index = func.bin_file.zigObjectPtr().?.decls_map.get(direct).?.atom; - try func.addLabel(.call, func.bin_file.getAtom(atom_index).sym_index); + try func.addLabel(.call, @intFromEnum(func.bin_file.getAtom(atom_index).sym_index)); } else { // in this case we call a function pointer // so load its value onto the stack @@ -3158,7 +3159,7 @@ fn lowerAnonDeclRef( }, } const target_atom_index = func.bin_file.zigObjectPtr().?.anon_decls.get(decl_val).?; - const target_sym_index = func.bin_file.getAtom(target_atom_index).getSymbolIndex().?; + const target_sym_index = @intFromEnum(func.bin_file.getAtom(target_atom_index).sym_index); if (is_fn_body) { return WValue{ .function_index = target_sym_index }; } else if (offset == 0) { @@ -3189,7 +3190,7 @@ fn lowerDeclRefValue(func: *CodeGen, tv: TypedValue, decl_index: InternPool.Decl const atom_index = try func.bin_file.getOrCreateAtomForDecl(decl_index); const atom = func.bin_file.getAtom(atom_index); - const target_sym_index = atom.sym_index; + const target_sym_index = @intFromEnum(atom.sym_index); if (decl.ty.zigTypeTag(mod) == .Fn) { return WValue{ .function_index = target_sym_index }; } else if (offset == 0) { @@ -3711,7 +3712,7 @@ fn airCmpLtErrorsLen(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; const operand = try func.resolveInst(un_op); const sym_index = try func.bin_file.getGlobalSymbol("__zig_errors_len", null); - const errors_len = WValue{ .memory = sym_index }; + const errors_len = WValue{ .memory = @intFromEnum(sym_index) }; try func.emitWValue(operand); const mod = func.bin_file.base.comp.module.?; @@ -7153,7 +7154,7 @@ fn callIntrinsic( args: []const WValue, ) InnerError!WValue { assert(param_types.len == args.len); - const symbol_index = func.bin_file.base.getGlobalSymbol(name, null) catch |err| { + const symbol_index = func.bin_file.getGlobalSymbol(name, null) catch |err| { return func.fail("Could not find or create global symbol '{s}'", .{@errorName(err)}); }; @@ -7181,7 +7182,7 @@ fn callIntrinsic( } // Actually call our intrinsic - try func.addLabel(.call, symbol_index); + try func.addLabel(.call, @intFromEnum(symbol_index)); if (!return_type.hasRuntimeBitsIgnoreComptime(mod)) { return WValue.none; @@ -7224,7 +7225,7 @@ fn getTagNameFunction(func: *CodeGen, enum_ty: Type) InnerError!u32 { // check if we already generated code for this. if (func.bin_file.findGlobalSymbol(func_name)) |loc| { - return loc.index; + return @intFromEnum(loc.index); } const int_tag_ty = enum_ty.intTagType(mod); @@ -7364,7 +7365,8 @@ fn getTagNameFunction(func: *CodeGen, enum_ty: Type) InnerError!u32 { const slice_ty = Type.slice_const_u8_sentinel_0; const func_type = try genFunctype(arena, .Unspecified, &.{int_tag_ty.ip_index}, slice_ty, mod); - return func.bin_file.createFunction(func_name, func_type, &body_list, &relocs); + const sym_index = try func.bin_file.createFunction(func_name, func_type, &body_list, &relocs); + return @intFromEnum(sym_index); } fn airErrorSetHasValue(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
