v8/test/cctest/wasm/test-wasm-import-wrapper-cache.cc
Clemens Hammacher 9716f689b8 [wasm] Do not store ModuleEnv
Instead, create it when needed and pass it down to the actual
compilation.
This saves memory by making the WasmCompilationUnit smaller and will
eventually allow us to implement the trap handler fallback correctly by
using an updated ModuleEnv in background compilation and tier up.

R=mstarzinger@chromium.org

Bug: v8:5277, v8:8343
Change-Id: I0dc3a37fb88e54eb4822dc99d58ff024f4b2a367
Reviewed-on: https://chromium-review.googlesource.com/c/1293953
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56896}
2018-10-23 12:47:14 +00:00

128 lines
3.5 KiB
C++

// Copyright 2018 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/compiler/wasm-compiler.h"
#include "src/wasm/function-compiler.h"
#include "src/wasm/wasm-code-manager.h"
#include "src/wasm/wasm-engine.h"
#include "src/wasm/wasm-import-wrapper-cache-inl.h"
#include "src/wasm/wasm-module.h"
#include "test/cctest/cctest.h"
#include "test/common/wasm/test-signatures.h"
namespace v8 {
namespace internal {
namespace wasm {
namespace test_wasm_import_wrapper_cache {
std::unique_ptr<NativeModule> NewModule(Isolate* isolate) {
WasmCodeManager* manager = isolate->wasm_engine()->code_manager();
std::shared_ptr<WasmModule> module(new WasmModule);
bool can_request_more = false;
size_t size = 100;
auto native_module = manager->NewNativeModule(
isolate, kAllWasmFeatures, size, can_request_more, std::move(module));
native_module->SetRuntimeStubs(isolate);
return native_module;
}
TEST(CacheHit) {
Isolate* isolate = CcTest::InitIsolateOnce();
auto module = NewModule(isolate);
TestSignatures sigs;
auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
WasmCode* c1 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_i());
CHECK_NOT_NULL(c1);
CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
WasmCode* c2 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_i());
CHECK_NOT_NULL(c2);
CHECK_EQ(c1, c2);
}
TEST(CacheMissSig) {
Isolate* isolate = CcTest::InitIsolateOnce();
auto module = NewModule(isolate);
TestSignatures sigs;
auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
WasmCode* c1 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_i());
CHECK_NOT_NULL(c1);
CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
WasmCode* c2 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_ii());
CHECK_NOT_NULL(c2);
CHECK_NE(c1, c2);
}
TEST(CacheMissKind) {
Isolate* isolate = CcTest::InitIsolateOnce();
auto module = NewModule(isolate);
TestSignatures sigs;
auto kind1 = compiler::WasmImportCallKind::kJSFunctionArityMatch;
auto kind2 = compiler::WasmImportCallKind::kJSFunctionArityMismatch;
WasmCode* c1 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind1, sigs.i_i());
CHECK_NOT_NULL(c1);
CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
WasmCode* c2 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind2, sigs.i_i());
CHECK_NOT_NULL(c2);
CHECK_NE(c1, c2);
}
TEST(CacheHitMissSig) {
Isolate* isolate = CcTest::InitIsolateOnce();
auto module = NewModule(isolate);
TestSignatures sigs;
auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
WasmCode* c1 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_i());
CHECK_NOT_NULL(c1);
CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
WasmCode* c2 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_ii());
CHECK_NOT_NULL(c2);
CHECK_NE(c1, c2);
WasmCode* c3 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_i());
CHECK_NOT_NULL(c3);
CHECK_EQ(c1, c3);
WasmCode* c4 =
module->import_wrapper_cache()->GetOrCompile(isolate, kind, sigs.i_ii());
CHECK_NOT_NULL(c4);
CHECK_EQ(c2, c4);
}
} // namespace test_wasm_import_wrapper_cache
} // namespace wasm
} // namespace internal
} // namespace v8