5c7e3230ab
The serialized module contains information for each function whether the serialized code for the function exists, and whether the function has been executed before serialization. The latter information is used to decide if the function should get compiled eagerly after deserialization (in case the function has been executed before serialization), or if the function should get compiled lazily because it will probably not be executed anytime soon. So far this code only worked for eager compilation. When lazy compilation was enabled, all functions would get compiled lazily after deserialization. With this CL the behavior described above is extended to lazy compilation. R=clemensb@chromium.org Bug: v8:12926 Change-Id: Ifd6f400396222105feffa472c2e8787e1358220e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3807583 Reviewed-by: Clemens Backes <clemensb@chromium.org> Commit-Queue: Andreas Haas <ahaas@chromium.org> Cr-Commit-Position: refs/heads/main@{#82171}
58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
// 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: --allow-natives-syntax --wasm-dynamic-tiering --liftoff
|
|
// Flags: --no-wasm-native-module-cache-enabled
|
|
// Make the test faster:
|
|
// Flags: --wasm-tiering-budget=1000
|
|
|
|
// This test busy-waits for tier-up to be complete, hence it does not work in
|
|
// predictable mode where we only have a single thread.
|
|
// Flags: --no-predictable
|
|
|
|
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
|
|
|
const num_functions = 3;
|
|
|
|
function create_builder() {
|
|
const builder = new WasmModuleBuilder();
|
|
builder.addImport("foo", "bar", kSig_i_v);
|
|
for (let i = 0; i < num_functions; ++i) {
|
|
builder.addFunction('f' + i, kSig_i_v)
|
|
.addBody(wasmI32Const(i))
|
|
.exportFunc();
|
|
}
|
|
return builder;
|
|
}
|
|
|
|
const wire_bytes = create_builder().toBuffer();
|
|
|
|
function serializeModule() {
|
|
const module = new WebAssembly.Module(wire_bytes);
|
|
let instance = new WebAssembly.Instance(module, {foo: {bar: () => 1}});
|
|
// Execute {f1} until it gets tiered up.
|
|
while (!%IsTurboFanFunction(instance.exports.f1)) {
|
|
instance.exports.f1();
|
|
}
|
|
// Execute {f2} once, so that the module knows that this is a used function.
|
|
instance.exports.f2();
|
|
const buff = %SerializeWasmModule(module);
|
|
return buff;
|
|
};
|
|
|
|
const serialized_module = serializeModule();
|
|
|
|
(function testSerializedModule() {
|
|
print(arguments.callee.name);
|
|
const module = %DeserializeWasmModule(serialized_module, wire_bytes);
|
|
|
|
const instance = new WebAssembly.Instance(module, {foo: {bar: () => 1}});
|
|
|
|
assertTrue(%IsTurboFanFunction(instance.exports.f1));
|
|
assertTrue(%IsLiftoffFunction(instance.exports.f2));
|
|
assertTrue(
|
|
!%IsLiftoffFunction(instance.exports.f0) &&
|
|
!%IsTurboFanFunction(instance.exports.f0));
|
|
})();
|