authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-05 20:22:34-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
log290d97bd099cde2d9d4daef11bb836bfb942a90a
tree040dbfb735c21b0bd1bd8d85f2a31285e6b5d555
parent94648a0383056e99110a4a894b86f4a762e4526c

wasm linker: emit __heap_base and __heap_end globals and datas


1 files changed, 20 insertions(+), 12 deletions(-)

src/link/Wasm/Flush.zig+20-12
...@@ -564,16 +564,9 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {...@@ -564,16 +564,9 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
564 for (wasm.globals.keys()) |global_resolution| {564 for (wasm.globals.keys()) |global_resolution| {
565 switch (global_resolution.unpack(wasm)) {565 switch (global_resolution.unpack(wasm)) {
566 .unresolved => unreachable,566 .unresolved => unreachable,
567 .__heap_base => @panic("TODO"),567 .__heap_base => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_base),
568 .__heap_end => @panic("TODO"),568 .__heap_end => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_end),
569 .__stack_pointer => {569 .__stack_pointer => try appendGlobal(gpa, binary_bytes, 1, virtual_addrs.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 },
577 .__tls_align => @panic("TODO"),570 .__tls_align => @panic("TODO"),
578 .__tls_base => @panic("TODO"),571 .__tls_base => @panic("TODO"),
579 .__tls_size => @panic("TODO"),572 .__tls_size => @panic("TODO"),
...@@ -781,8 +774,14 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {...@@ -781,8 +774,14 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
781 const code_start = binary_bytes.items.len;774 const code_start = binary_bytes.items.len;
782 append: {775 append: {
783 const code = switch (segment_id.unpack(wasm)) {776 const code = switch (segment_id.unpack(wasm)) {
784 .__heap_base => @panic("TODO"),777 .__heap_base => {
785 .__heap_end => @panic("TODO"),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 .__zig_error_names => {785 .__zig_error_names => {
787 try binary_bytes.appendSlice(gpa, wasm.error_name_bytes.items);786 try binary_bytes.appendSlice(gpa, wasm.error_name_bytes.items);
788 break :append;787 break :append;
...@@ -1772,3 +1771,12 @@ fn appendReservedI32Const(bytes: *std.ArrayListUnmanaged(u8), val: u32) void {...@@ -1772,3 +1771,12 @@ fn appendReservedI32Const(bytes: *std.ArrayListUnmanaged(u8), val: u32) void {
1772fn appendReservedUleb32(bytes: *std.ArrayListUnmanaged(u8), val: u32) void {1771fn appendReservedUleb32(bytes: *std.ArrayListUnmanaged(u8), val: u32) void {
1773 leb.writeUleb128(bytes.fixedWriter(), val) catch unreachable;1772 leb.writeUleb128(bytes.fixedWriter(), val) catch unreachable;
1774}1773}
1774
1775fn 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}