// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --wasm-max-code-space-size-mb=1 // Disable lazy compilation, so we actually generate a lot of code at once. // Flags: --no-wasm-lazy-compilation // Limit the number of background threads, so each thread generates more code. // Flags: --wasm-num-compilation-tasks=2 // This is a regression test for https://crbug.com/v8/13436. If a single // background thread generates more code than fits in a single code space, we // need to split it into multiple code spaces. d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); const start = performance.now(); function time(name) { const ms_since_start = (performance.now() - start).toFixed(1).padStart(7); print(`[${ms_since_start}] ${name}`); } // At the time of writing this test (Nov 2022), this module generated ~20MB of // code on x64 and ~18MB on arm64. const builder = new WasmModuleBuilder(); const kNumFunctions = 1500; // Build a large body. Then append one instruction to get different code per // function (for the case that we decide to merge identical code objects in the // future). time('Build function template.'); let body_template = [kExprLocalGet, 0]; for (let i = 0; i < kNumFunctions; ++i) { body_template.push(kExprCallFunction, ...wasmSignedLeb(i)); } time(`Adding ${kNumFunctions} functions`); for (let i = 0; i < kNumFunctions; ++i) { if (i != 0 && i % 100 == 0) time(`... added ${i} functions`); let body = body_template.concat([...wasmI32Const(i), kExprI32Add, kExprEnd]); builder.addFunction('f' + i, kSig_i_i).addBodyWithEnd(body); } time('Building buffer.'); const wasm_buf = builder.toBuffer(); time('Compiling Wasm module.'); new WebAssembly.Module(wasm_buf);