From 290d97bd099cde2d9d4daef11bb836bfb942a90a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 5 Jan 2025 20:22:34 -0800 Subject: wasm linker: emit __heap_base and __heap_end globals and datas --- src/link/Wasm/Flush.zig | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/link/Wasm/Flush.zig b/src/link/Wasm/Flush.zig index 11874351a2..ee95a6b3dd 100644 --- a/src/link/Wasm/Flush.zig +++ b/src/link/Wasm/Flush.zig @@ -564,16 +564,9 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { for (wasm.globals.keys()) |global_resolution| { switch (global_resolution.unpack(wasm)) { .unresolved => unreachable, - .__heap_base => @panic("TODO"), - .__heap_end => @panic("TODO"), - .__stack_pointer => { - try binary_bytes.ensureUnusedCapacity(gpa, 9); - binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Valtype.i32)); - binary_bytes.appendAssumeCapacity(1); // mutable - binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_const)); - appendReservedUleb32(binary_bytes, virtual_addrs.stack_pointer); - binary_bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.end)); - }, + .__heap_base => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_base), + .__heap_end => try appendGlobal(gpa, binary_bytes, 0, virtual_addrs.heap_end), + .__stack_pointer => try appendGlobal(gpa, binary_bytes, 1, virtual_addrs.stack_pointer), .__tls_align => @panic("TODO"), .__tls_base => @panic("TODO"), .__tls_size => @panic("TODO"), @@ -781,8 +774,14 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { const code_start = binary_bytes.items.len; append: { const code = switch (segment_id.unpack(wasm)) { - .__heap_base => @panic("TODO"), - .__heap_end => @panic("TODO"), + .__heap_base => { + mem.writeInt(u32, try binary_bytes.addManyAsArray(gpa, 4), virtual_addrs.heap_base, .little); + break :append; + }, + .__heap_end => { + mem.writeInt(u32, try binary_bytes.addManyAsArray(gpa, 4), virtual_addrs.heap_end, .little); + break :append; + }, .__zig_error_names => { try binary_bytes.appendSlice(gpa, wasm.error_name_bytes.items); break :append; @@ -1772,3 +1771,12 @@ fn appendReservedI32Const(bytes: *std.ArrayListUnmanaged(u8), val: u32) void { fn appendReservedUleb32(bytes: *std.ArrayListUnmanaged(u8), val: u32) void { leb.writeUleb128(bytes.fixedWriter(), val) catch unreachable; } + +fn appendGlobal(gpa: Allocator, bytes: *std.ArrayListUnmanaged(u8), mutable: u8, val: u32) Allocator.Error!void { + try bytes.ensureUnusedCapacity(gpa, 9); + bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Valtype.i32)); + bytes.appendAssumeCapacity(mutable); + bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_const)); + appendReservedUleb32(bytes, val); + bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.end)); +} -- cgit v1.2.3