| ... | ... | @@ -564,16 +564,9 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { |
| 564 | 564 | for (wasm.globals.keys()) |global_resolution| { |
| 565 | 565 | switch (global_resolution.unpack(wasm)) { |
| 566 | 566 | .unresolved => unreachable, |
| 567 | | .__heap_base => @panic("TODO"), |
| 568 | | .__heap_end => @panic("TODO"), |
| 569 | | .__stack_pointer => { |
| 570 | | try binary_bytes.ensureUnusedCapacity(gpa, 9); |
| 571 | | binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Valtype.i32)); |
| 572 | | binary_bytes.appendAssumeCapacity(1); // mutable |
| 573 | | binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_const)); |
| 574 | | appendReservedUleb32(binary_bytes, virtual_addrs.stack_pointer); |
| 575 | | binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.end)); |
| 576 | | }, |
| 567 | .__heap_base => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_base), |
| 568 | .__heap_end => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_end), |
| 569 | .__stack_pointer => try appendGlobal(gpa, binary_bytes, 1, virtual_addrs.stack_pointer), |
| 577 | 570 | .__tls_align => @panic("TODO"), |
| 578 | 571 | .__tls_base => @panic("TODO"), |
| 579 | 572 | .__tls_size => @panic("TODO"), |
| ... | ... | @@ -781,8 +774,14 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { |
| 781 | 774 | const code_start = binary_bytes.items.len; |
| 782 | 775 | append: { |
| 783 | 776 | const code = switch (segment_id.unpack(wasm)) { |
| 784 | | .__heap_base => @panic("TODO"), |
| 785 | | .__heap_end => @panic("TODO"), |
| 777 | .__heap_base => { |
| 778 | mem.writeInt(u32, try binary_bytes.addManyAsArray(gpa, 4), virtual_addrs.heap_base, .little); |
| 779 | break :append; |
| 780 | }, |
| 781 | .__heap_end => { |
| 782 | mem.writeInt(u32, try binary_bytes.addManyAsArray(gpa, 4), virtual_addrs.heap_end, .little); |
| 783 | break :append; |
| 784 | }, |
| 786 | 785 | .__zig_error_names => { |
| 787 | 786 | try binary_bytes.appendSlice(gpa, wasm.error_name_bytes.items); |
| 788 | 787 | break :append; |
| ... | ... | @@ -1772,3 +1771,12 @@ fn appendReservedI32Const(bytes: *std.ArrayListUnmanaged(u8), val: u32) void { |
| 1772 | 1771 | fn appendReservedUleb32(bytes: *std.ArrayListUnmanaged(u8), val: u32) void { |
| 1773 | 1772 | leb.writeUleb128(bytes.fixedWriter(), val) catch unreachable; |
| 1774 | 1773 | } |
| 1774 | |
| 1775 | fn appendGlobal(gpa: Allocator, bytes: *std.ArrayListUnmanaged(u8), mutable: u8, val: u32) Allocator.Error!void { |
| 1776 | try bytes.ensureUnusedCapacity(gpa, 9); |
| 1777 | bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Valtype.i32)); |
| 1778 | bytes.appendAssumeCapacity(mutable); |
| 1779 | bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_const)); |
| 1780 | appendReservedUleb32(bytes, val); |
| 1781 | bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.end)); |
| 1782 | } |