wasm-import-wrapper-cache.cc 1.51 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
// 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/wasm/wasm-import-wrapper-cache.h"

#include <vector>

#include "src/counters.h"
#include "src/wasm/wasm-code-manager.h"

namespace v8 {
namespace internal {
namespace wasm {

WasmImportWrapperCache::~WasmImportWrapperCache() {
  std::vector<WasmCode*> ptrs;
  ptrs.reserve(entry_map_.size());
  for (auto& e : entry_map_) ptrs.push_back(e.second);
  WasmCode::DecrementRefCount(VectorOf(ptrs));
}

WasmCode* WasmImportWrapperCache::GetOrCompile(
    WasmEngine* wasm_engine, Counters* counters,
    compiler::WasmImportCallKind kind, FunctionSig* sig) {
  base::MutexGuard lock(&mutex_);
  CacheKey key(static_cast<uint8_t>(kind), *sig);
  WasmCode*& cached = entry_map_[key];
  if (cached == nullptr) {
    // TODO(wasm): no need to hold the lock while compiling an import wrapper.
    bool source_positions = native_module_->module()->origin == kAsmJsOrigin;
    // Keep the {WasmCode} alive until we explicitly call {IncRef}.
    WasmCodeRefScope code_ref_scope;
    cached = compiler::CompileWasmImportCallWrapper(
        wasm_engine, native_module_, kind, sig, source_positions);
    cached->IncRef();
    counters->wasm_generated_code_size()->Increment(
        cached->instructions().length());
    counters->wasm_reloc_size()->Increment(cached->reloc_info().length());
  }
  return cached;
}

}  // namespace wasm
}  // namespace internal
}  // namespace v8