9716f689b8
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}
128 lines
3.5 KiB
C++
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
|