[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:
parent
d3dbd42615
commit
ca092440f3
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user