Commit ca092440 authored by Andreas Haas's avatar Andreas Haas Committed by V8 LUCI CQ

[wasm] Deserialization should trigger FinishedTopTierCompilation event

The C-API does not support dynamic tiering and still waits for top-tier
compilation to finish before serializing code when the explicit
serialize() function gets called. This means that serialize() can only
finish if the kFinishedTopTierCompilation event was triggered first.
With this CL the kFinishedTopTierCompilation event is also triggered
after deserialization so that serialize() can work after
deserialization.

R=clemensb@chromium.org

Bug: v8:11024
Change-Id: I3dd14e37087e3cbfbc28cb5625c9f3715f6c236b
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3404773Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/main@{#78719}
parent d3dbd426
......@@ -3225,7 +3225,16 @@ void CompilationStateImpl::InitializeCompilationProgressAfterDeserialization(
// We have to trigger the compilation events to finish compilation.
// Typically the events get triggered when a CompilationUnit finishes, but
// with lazy compilation there are no compilation units.
// The {kFinishedBaselineCompilation} event is needed for module
// compilation to finish.
finished_events_.Add(CompilationEvent::kFinishedBaselineCompilation);
if (liftoff_functions.empty() && lazy_functions.empty()) {
// All functions exist now as TurboFan functions, so we can trigger the
// {kFinishedTopTierCompilation} event.
// The {kFinishedTopTierCompilation} event is needed for the C-API so
// that {serialize()} works after {deserialize()}.
finished_events_.Add(CompilationEvent::kFinishedTopTierCompilation);
}
}
compilation_progress_.assign(module->num_declared_functions,
kProgressAfterTurbofanDeserialization);
......
......@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/execution/isolate.h"
#include "src/wasm/c-api.h"
#include "test/wasm-api-tests/wasm-api-test.h"
namespace v8 {
......@@ -29,8 +31,24 @@ TEST_F(WasmCapiTest, Serialize) {
vec<byte_t> serialized = module()->serialize();
EXPECT_TRUE(serialized); // Serialization succeeded.
// We reset the module and collect it to make sure the NativeModuleCache does
// not contain it anymore. Otherwise deserialization will not happen.
ResetModule();
i::Isolate* isolate =
reinterpret_cast<::wasm::StoreImpl*>(store())->i_isolate();
isolate->heap()->PreciseCollectAllGarbage(
i::Heap::kForcedGC, i::GarbageCollectionReason::kTesting,
v8::kNoGCCallbackFlags);
isolate->heap()->PreciseCollectAllGarbage(
i::Heap::kForcedGC, i::GarbageCollectionReason::kTesting,
v8::kNoGCCallbackFlags);
own<Module> deserialized = Module::deserialize(store(), serialized);
// Try to serialize the module again. This can fail if deserialization does
// not set up a clean state.
deserialized->serialize();
own<FuncType> callback_type =
FuncType::make(ownvec<ValType>::make(), ownvec<ValType>::make());
own<Func> callback = Func::make(store(), callback_type.get(), Callback);
......
......@@ -121,6 +121,8 @@ class WasmCapiTest : public ::testing::Test {
return table;
}
void ResetModule() { module_.reset(); }
void Shutdown() {
exports_.reset();
instance_.reset();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment