[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/+/3404773
Reviewed-by: Clemens Backes <clemensb@chromium.org>
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/main@{#78719}
This commit is contained in:
Andreas Haas 2022-01-21 12:58:08 +01:00 committed by V8 LUCI CQ
parent d3dbd42615
commit ca092440f3
3 changed files with 29 additions and 0 deletions

View File

@ -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);

View File

@ -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);

View File

@ -121,6 +121,8 @@ class WasmCapiTest : public ::testing::Test {
return table;
}
void ResetModule() { module_.reset(); }
void Shutdown() {
exports_.reset();
instance_.reset();