}
// writeMemorySec writes the section that declares linear memories. Currently one linear memory is being used.
+// Linear memory always starts at address zero. More memory can be requested with the GrowMemory instruction.
func writeMemorySec(ctxt *ld.Link) {
sizeOffset := writeSecHeader(ctxt, sectionMemory)
- // Linear memory always starts at address zero.
- // The unit of the sizes is "WebAssembly page size", which is 64Ki.
- // The minimum is currently set to 1GB, which is a lot.
- // More memory can be requested with the grow_memory instruction,
- // but this operation currently is rather slow, so we avoid it for now.
- // TODO(neelance): Use lower initial memory size.
- writeUleb128(ctxt.Out, 1) // number of memories
- ctxt.Out.WriteByte(0x00) // no maximum memory size
- writeUleb128(ctxt.Out, 1024*16) // minimum (initial) memory size
+ const (
+ initialSize = 16 << 20 // 16MB, enough for runtime init without growing
+ wasmPageSize = 64 << 10 // 64KB
+ )
+
+ writeUleb128(ctxt.Out, 1) // number of memories
+ ctxt.Out.WriteByte(0x00) // no maximum memory size
+ writeUleb128(ctxt.Out, initialSize/wasmPageSize) // minimum (initial) memory size
writeSecSize(ctxt, sizeOffset)
}
// logHeapArenaBytes is log_2 of heapArenaBytes. For clarity,
// prefer using heapArenaBytes where possible (we need the
// constant to compute some other constants).
- logHeapArenaBytes = (6+20)*(_64bit*(1-sys.GoosWindows)*(1-sys.GoosAix)) + (2+20)*(_64bit*sys.GoosWindows) + (2+20)*(1-_64bit) + (8+20)*sys.GoosAix
+ logHeapArenaBytes = (6+20)*(_64bit*(1-sys.GoosWindows)*(1-sys.GoosAix)*(1-sys.GoarchWasm)) + (2+20)*(_64bit*sys.GoosWindows) + (2+20)*(1-_64bit) + (8+20)*sys.GoosAix + (2+20)*sys.GoarchWasm
// heapArenaBitmapBytes is the size of each heap arena's bitmap.
heapArenaBitmapBytes = heapArenaBytes / (sys.PtrSize * 8 / 2)
_g_.m.mcache = allocmcache()
// Create initial arena growth hints.
- if sys.PtrSize == 8 && GOARCH != "wasm" {
+ if sys.PtrSize == 8 {
// On a 64-bit machine, we pick the following hints
// because:
//