| ... | ... | @@ -27,6 +27,8 @@ pub fn lowerToCode(emit: *Emit) Error!void { |
| 27 | 27 | const comp = wasm.base.comp; |
| 28 | 28 | const gpa = comp.gpa; |
| 29 | 29 | const is_obj = comp.config.output_mode == .Obj; |
| 30 | const target = &comp.root_mod.resolved_target.result; |
| 31 | const is_wasm32 = target.cpu.arch == .wasm32; |
| 30 | 32 | |
| 31 | 33 | const tags = mir.instructions.items(.tag); |
| 32 | 34 | const datas = mir.instructions.items(.data); |
| ... | ... | @@ -56,12 +58,12 @@ pub fn lowerToCode(emit: *Emit) Error!void { |
| 56 | 58 | continue :loop tags[inst]; |
| 57 | 59 | }, |
| 58 | 60 | .nav_ref => { |
| 59 | | try navRefOff(wasm, code, .{ .ip_index = datas[inst].ip_index, .offset = 0 }); |
| 61 | try navRefOff(wasm, code, .{ .ip_index = datas[inst].ip_index, .offset = 0 }, is_wasm32); |
| 60 | 62 | inst += 1; |
| 61 | 63 | continue :loop tags[inst]; |
| 62 | 64 | }, |
| 63 | 65 | .nav_ref_off => { |
| 64 | | try navRefOff(wasm, code, mir.extraData(Mir.NavRefOff, datas[inst].payload).data); |
| 66 | try navRefOff(wasm, code, mir.extraData(Mir.NavRefOff, datas[inst].payload).data, is_wasm32); |
| 65 | 67 | inst += 1; |
| 66 | 68 | continue :loop tags[inst]; |
| 67 | 69 | }, |
| ... | ... | @@ -80,6 +82,29 @@ pub fn lowerToCode(emit: *Emit) Error!void { |
| 80 | 82 | inst += 1; |
| 81 | 83 | continue :loop tags[inst]; |
| 82 | 84 | }, |
| 85 | .error_name_table_ref => { |
| 86 | try code.ensureUnusedCapacity(gpa, 11); |
| 87 | const opcode: std.wasm.Opcode = if (is_wasm32) .i32_const else .i64_const; |
| 88 | code.appendAssumeCapacity(@intFromEnum(opcode)); |
| 89 | if (is_obj) { |
| 90 | try wasm.out_relocs.append(gpa, .{ |
| 91 | .offset = @intCast(code.items.len), |
| 92 | .index = try wasm.errorNameTableSymbolIndex(), |
| 93 | .tag = if (is_wasm32) .MEMORY_ADDR_LEB else .MEMORY_ADDR_LEB64, |
| 94 | .addend = 0, |
| 95 | }); |
| 96 | code.appendNTimesAssumeCapacity(0, if (is_wasm32) 5 else 10); |
| 97 | |
| 98 | inst += 1; |
| 99 | continue :loop tags[inst]; |
| 100 | } else { |
| 101 | const addr = try wasm.errorNameTableAddr(); |
| 102 | leb.writeIleb128(code.fixedWriter(), addr) catch unreachable; |
| 103 | |
| 104 | inst += 1; |
| 105 | continue :loop tags[inst]; |
| 106 | } |
| 107 | }, |
| 83 | 108 | .br_if, .br, .memory_grow, .memory_size => { |
| 84 | 109 | try code.ensureUnusedCapacity(gpa, 11); |
| 85 | 110 | code.appendAssumeCapacity(@intFromEnum(tags[inst])); |
| ... | ... | @@ -607,11 +632,9 @@ fn encodeMemArg(code: *std.ArrayListUnmanaged(u8), mem_arg: Mir.MemArg) void { |
| 607 | 632 | leb.writeUleb128(code.fixedWriter(), mem_arg.offset) catch unreachable; |
| 608 | 633 | } |
| 609 | 634 | |
| 610 | | fn uavRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir.UavRefOff) !void { |
| 635 | fn uavRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir.UavRefOff, is_wasm32: bool) !void { |
| 611 | 636 | const comp = wasm.base.comp; |
| 612 | 637 | const gpa = comp.gpa; |
| 613 | | const target = comp.root_mod.resolved_target.result; |
| 614 | | const is_wasm32 = target.cpu.arch == .wasm32; |
| 615 | 638 | const is_obj = comp.config.output_mode == .Obj; |
| 616 | 639 | const opcode: std.wasm.Opcode = if (is_wasm32) .i32_const else .i64_const; |
| 617 | 640 | |
| ... | ... | @@ -636,13 +659,12 @@ fn uavRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir |
| 636 | 659 | leb.writeUleb128(code.fixedWriter(), addr + data.offset) catch unreachable; |
| 637 | 660 | } |
| 638 | 661 | |
| 639 | | fn navRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir.NavRefOff) !void { |
| 662 | fn navRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir.NavRefOff, is_wasm32: bool) !void { |
| 640 | 663 | const comp = wasm.base.comp; |
| 641 | 664 | const zcu = comp.zcu.?; |
| 642 | 665 | const ip = &zcu.intern_pool; |
| 643 | 666 | const gpa = comp.gpa; |
| 644 | 667 | const is_obj = comp.config.output_mode == .Obj; |
| 645 | | const target = &comp.root_mod.resolved_target.result; |
| 646 | 668 | const nav_ty = ip.getNav(data.nav_index).typeOf(ip); |
| 647 | 669 | |
| 648 | 670 | try code.ensureUnusedCapacity(gpa, 11); |
| ... | ... | @@ -663,7 +685,6 @@ fn navRefOff(wasm: *link.File.Wasm, code: *std.ArrayListUnmanaged(u8), data: Mir |
| 663 | 685 | leb.writeUleb128(code.fixedWriter(), addr + data.offset) catch unreachable; |
| 664 | 686 | } |
| 665 | 687 | } else { |
| 666 | | const is_wasm32 = target.cpu.arch == .wasm32; |
| 667 | 688 | const opcode: std.wasm.Opcode = if (is_wasm32) .i32_const else .i64_const; |
| 668 | 689 | code.appendAssumeCapacity(@intFromEnum(opcode)); |
| 669 | 690 | if (is_obj) { |