v8/test/wasm-api-tests/serialize.cc

68 lines
2.1 KiB
C++
Raw Normal View History

// Copyright 2019 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.
#include "src/execution/isolate.h"
#include "src/wasm/c-api.h"
#include "test/wasm-api-tests/wasm-api-test.h"
namespace v8 {
namespace internal {
namespace wasm {
namespace {
bool g_callback_called;
own<Trap> Callback(const Val args[], Val results[]) {
g_callback_called = true;
return nullptr;
}
} // namespace
TEST_F(WasmCapiTest, Serialize) {
FunctionSig sig(0, 0, nullptr);
uint32_t callback_index =
builder()->AddImport(base::CStrVector("callback"), &sig);
byte code[] = {WASM_CALL_FUNCTION0(callback_index)};
AddExportedFunction(base::CStrVector("run"), code, sizeof(code), &sig);
Compile();
vec<byte_t> serialized = module()->serialize();
Reland "[wasm] Ensure that only TurboFan code is serialized" This is a reland of 60ee70bb40efea6f05476dc19f7a5b490193a107. The wasm c-api flakes were fixed in https://crrev.com/c/2349293. Original change's description: > [wasm] Ensure that only TurboFan code is serialized > > We have the implicit assumption that Liftoff code will never be > serialized, and we start relying on that when implementing new features > (debugging, dynamic tiering). > > This CL makes the serializer fail if the module contains any Liftoff > code. Existing tests are changed to ensure that we fully tiered up > before serializing a module (similar to the logic in Chromium). > The "wasm-clone-module" test needs to serialize the module before > enabling the debugger. > > Note that chrome currently only serializes a module after it fully > tiered up, so that should be fine. If other embedders need the ability > to serialize a module in an arbitrary state, we will have to fix this > later. With this CL we will be on the safe side though and (gracefully) > fail serialization instead of accidentally serializing Liftoff code. > > R=ahaas@chromium.org > > Bug: v8:10777 > Change-Id: I1245e5f7fda3447a544c1e3525e1239cde759174 > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2336799 > Commit-Queue: Clemens Backes <clemensb@chromium.org> > Reviewed-by: Andreas Haas <ahaas@chromium.org> > Cr-Commit-Position: refs/heads/master@{#69276} Bug: v8:10777 Change-Id: I2a7c1429812ca46d88a2902b8e0a7b7e3d638b56 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2349290 Reviewed-by: Andreas Haas <ahaas@chromium.org> Commit-Queue: Clemens Backes <clemensb@chromium.org> Cr-Commit-Position: refs/heads/master@{#69335}
2020-08-11 11:36:55 +00:00
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);
Extern* imports[] = {callback.get()};
own<Instance> instance = Instance::make(store(), deserialized.get(), imports);
ownvec<Extern> exports = instance->exports();
Func* run = exports[0]->func();
g_callback_called = false;
run->call();
EXPECT_TRUE(g_callback_called);
}
} // namespace wasm
} // namespace internal
} // namespace v8