v8/test/mjsunit/wasm/serialize-lazy-module.js
Andreas Haas 272e5a8766 [wasm] Do not serialize modules that don't contain TurboFan code
The wasm serialization format only contains TurboFan code. All other
functions are only represented by placeholders. With this CL
serialization fails if the serialized module does not contain any
TurboFan functions and would therefore consist only of placeholders.

This is a defense in depth approach, because ideally serialization
only gets triggered when TurboFan code is available. However, in some
scenarios like debugging it can happen that modules without TurboFan
code get serialized.

Bug: v8:12281
Change-Id: Ib05430ff89eb2317da80fc0d086ce1d7ab0e919d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3212510
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#77715}
2021-11-04 15:47:03 +00:00

76 lines
2.2 KiB
JavaScript

// Copyright 2018 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.
// The test needs --no-liftoff because we can't serialize and deserialize
// Liftoff code.
// Flags: --wasm-lazy-compilation --allow-natives-syntax --expose-gc
// Flags: --no-liftoff
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
(function SerializeUncompiledModule() {
print(arguments.callee.name);
const [wire_bytes, i1, buff] = (function GenerateInstance() {
const builder = new WasmModuleBuilder();
// Add 20 functions.
for (let i = 0; i < 20; ++i) {
builder.addFunction('f' + i, kSig_i_i)
.addBody([kExprI32Const, i])
.exportFunc();
}
const wire_bytes = builder.toBuffer();
const module = new WebAssembly.Module(wire_bytes);
// Run one function so that serialization happens.
let instance = new WebAssembly.Instance(module);
instance.exports.f3();
const buff = %SerializeWasmModule(module);
return [wire_bytes, instance, buff];
})();
gc();
const module = %DeserializeWasmModule(buff, wire_bytes);
const i2 = new WebAssembly.Instance(module);
assertEquals(13, i2.exports.f13());
assertEquals(11, i1.exports.f11());
})();
(function SerializePartlyCompiledModule() {
print(arguments.callee.name);
const [wire_bytes, i1, buff] = (function GenerateInstance() {
const builder = new WasmModuleBuilder();
// Add 20 functions.
for (let i = 0; i < 20; ++i) {
builder.addFunction('f' + i, kSig_i_i)
.addBody([kExprI32Const, i])
.exportFunc();
}
const wire_bytes = builder.toBuffer();
const module = new WebAssembly.Module(wire_bytes);
const i1 = new WebAssembly.Instance(module);
// Run one function so that serialization happens.
i1.exports.f3();
const buff = %SerializeWasmModule(module);
assertEquals(2, i1.exports.f2());
assertEquals(11, i1.exports.f11());
return [wire_bytes, i1, buff];
})();
gc();
const module = %DeserializeWasmModule(buff, wire_bytes);
const i2 = new WebAssembly.Instance(module);
assertEquals(13, i2.exports.f13());
assertEquals(11, i1.exports.f11());
assertEquals(9, i1.exports.f9());
})();