authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-01-11 20:21:22+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-01-11 20:21:22+01:00
logf767f8e3dc158a74debdd288884458b860d2ebc9
tree2ffb442ed386854f86af948b5456aee36bfb32c0
parent48731ccea9007529324e555ac9f24277d28c0d74
signaturelock-open Commit is signed but in an unrecognized format.

wasm: Place the stack at the start of memory


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

src/link/Wasm.zig+20-8
...@@ -494,9 +494,21 @@ fn setupMemory(self: *Wasm) !void {...@@ -494,9 +494,21 @@ fn setupMemory(self: *Wasm) !void {
494 log.debug("Setting up memory layout", .{});494 log.debug("Setting up memory layout", .{});
495 const page_size = 64 * 1024;495 const page_size = 64 * 1024;
496 const stack_size = self.base.options.stack_size_override orelse page_size * 1;496 const stack_size = self.base.options.stack_size_override orelse page_size * 1;
497 const stack_alignment = 16;497 const stack_alignment = 16; // wasm's stack alignment as specified by tool-convention
498 var memory_ptr: u64 = self.base.options.global_base orelse 1024;498 // Always place the stack at the start by default
499 memory_ptr = std.mem.alignForwardGeneric(u64, memory_ptr, stack_alignment);499 // unless the user specified the global-base flag
500 var place_stack_first = true;
501 var memory_ptr: u64 = if (self.base.options.global_base) |base| blk: {
502 place_stack_first = false;
503 break :blk base;
504 } else 0;
505
506 if (place_stack_first) {
507 memory_ptr = std.mem.alignForwardGeneric(u64, memory_ptr, stack_alignment);
508 memory_ptr += stack_size;
509 // We always put the stack pointer global at index 0
510 self.globals.items[0].init.i32_const = @bitCast(i32, @intCast(u32, memory_ptr));
511 }
500512
501 var offset: u32 = @intCast(u32, memory_ptr);513 var offset: u32 = @intCast(u32, memory_ptr);
502 for (self.segments.items) |*segment, i| {514 for (self.segments.items) |*segment, i| {
...@@ -510,8 +522,11 @@ fn setupMemory(self: *Wasm) !void {...@@ -510,8 +522,11 @@ fn setupMemory(self: *Wasm) !void {
510 offset += segment.size;522 offset += segment.size;
511 }523 }
512524
513 memory_ptr = std.mem.alignForwardGeneric(u64, memory_ptr, stack_alignment);525 if (!place_stack_first) {
514 memory_ptr += stack_size;526 memory_ptr = std.mem.alignForwardGeneric(u64, memory_ptr, stack_alignment);
527 memory_ptr += stack_size;
528 self.globals.items[0].init.i32_const = @bitCast(i32, @intCast(u32, memory_ptr));
529 }
515530
516 // Setup the max amount of pages531 // Setup the max amount of pages
517 // For now we only support wasm32 by setting the maximum allowed memory size 2^32-1532 // For now we only support wasm32 by setting the maximum allowed memory size 2^32-1
...@@ -554,9 +569,6 @@ fn setupMemory(self: *Wasm) !void {...@@ -554,9 +569,6 @@ fn setupMemory(self: *Wasm) !void {
554 self.memories.limits.max = @intCast(u32, max_memory / page_size);569 self.memories.limits.max = @intCast(u32, max_memory / page_size);
555 log.debug("Maximum memory pages: {d}", .{self.memories.limits.max});570 log.debug("Maximum memory pages: {d}", .{self.memories.limits.max});
556 }571 }
557
558 // We always put the stack pointer global at index 0
559 self.globals.items[0].init.i32_const = @bitCast(i32, @intCast(u32, memory_ptr));
560}572}
561573
562fn resetState(self: *Wasm) void {574fn resetState(self: *Wasm) void {