35 static constexpr size_t kInitialReservationSize = 1 << 15;
37 static constexpr int kAllocationRetries = 2;
39 for (
int retries = 0;; ++retries) {
42 if (retries == kAllocationRetries) {
45 "Failed to allocate code space for import wrappers");
60 uint64_t signature_hash) {
61 cache_->mutex_.AssertHeld();
65 cache_->code_allocator_->AllocateForWrapper(desc.instr_size);
69 desc.buffer + desc.buffer_size - desc.reloc_size,
70 static_cast<size_t>(desc.reloc_size)};
73 const int safepoint_table_offset =
74 desc.safepoint_table_size == 0 ? 0 : desc.safepoint_table_offset;
75 const int handler_table_offset = desc.handler_table_offset;
76 const int constant_pool_offset = desc.constant_pool_offset;
77 const int code_comments_offset = desc.code_comments_offset;
78 const int instr_size = desc.instr_size;
84 jit_allocation.
CopyCode(0, desc.buffer, desc.instr_size);
86 intptr_t delta = code_space.
begin() - desc.buffer;
88 Address constant_pool_start = code_start + constant_pool_offset;
91 !it.
done(); it.next()) {
96 it.rinfo()->apply(delta);
100 const int frame_slot_count =
result.frame_slot_count;
101 const int ool_spill_count =
result.ool_spill_count;
102 constexpr bool frame_has_feedback_slot =
false;
108 result.tagged_parameter_slots,
109 safepoint_table_offset,
110 handler_table_offset,
111 constant_pool_offset,
112 code_comments_offset,
114 result.protected_instructions_data.as_vector(),
116 result.source_positions.as_vector(),
117 result.inlining_positions.as_vector(),
118 result.deopt_data.as_vector(),
123 frame_has_feedback_slot};
131 code->DecRefOnLiveCode();
134 cache_->entry_map_[
key] =
code;
137 std::map<Address, WasmCode*>& codes = cache_->codes_;
138 codes.emplace_hint(codes.end(), code->instruction_start(), code);
148 if (iter ==
codes_.end())
return nullptr;
150 if (iter->second->is_dying())
return nullptr;
166 wasm_code = cache_scope[
key];
169 if (!wasm_code->
is_dying())
return wasm_code;
174 sig->signature_hash());
180 isolate->counters()->wasm_generated_code_size()->Increment(
182 isolate->counters()->wasm_reloc_size()->Increment(
193 for (
const auto& entry :
codes_) {
194 entry.second->LogCode(isolate,
"", -1);
200 if (
codes_.empty() || wrappers.empty())
return;
203 return a->instruction_start() < b->instruction_start();
207 std::unordered_set<WasmCode*> fastset;
208 for (
WasmCode* wrapper : wrappers) {
209 fastset.insert(wrapper);
210 codes_.erase(wrapper->instruction_start());
213 if (fastset.contains(it->second)) {
220 for (
WasmCode* wrapper : wrappers) {
222 CHECK(wrapper->is_dying());
223 CHECK_EQ(wrapper->ref_count_.load(std::memory_order_acquire), 0);
236 auto it =
entry_map_.find({
kind, type_index, expected_arity, suspend});
239 if (it->second->is_dying())
return nullptr;
248 if (iter ==
codes_.begin())
return nullptr;
constexpr size_t size() const
constexpr T * begin() const
V8_EXPORT_PRIVATE void MemoryPressureNotification(v8::MemoryPressureLevel level, bool is_isolate_locked)
const std::shared_ptr< Counters > & async_counters()
static const int kApplyMask
static constexpr bool IsWasmCall(Mode mode)
static constexpr bool IsWasmStubCall(Mode mode)
static WritableJitAllocation RegisterJitAllocation(Address addr, size_t size, JitAllocationType type, bool enforce_write_api=false)
static V8_EXPORT_PRIVATE void FatalProcessOutOfMemory(Isolate *isolate, const char *location, const OOMDetails &details=kNoOOMDetails)
const base::AddressRegion & region() const
V8_INLINE void CopyCode(size_t dst_offset, const uint8_t *src, size_t num_bytes)
V8_WARN_UNUSED_RESULT VirtualMemory TryAllocate(size_t size)
static void AddRef(WasmCode *)
Address instruction_start() const
base::Vector< uint8_t > instructions() const
base::Vector< const uint8_t > reloc_info() const
bool contains(Address pc) const
void LogOutstandingCodesForIsolate(Isolate *)
V8_EXPORT_PRIVATE WasmCode * operator[](const CacheKey &key)
WasmImportWrapperCache *const cache_
WasmCode * AddWrapper(const CacheKey &key, WasmCompilationResult result, WasmCode::Kind kind, uint64_t signature_hash)
WasmCode * Lookup(Address pc) const
std::unordered_map< CacheKey, WasmCode *, CacheKeyHash > entry_map_
size_t EstimateCurrentMemoryConsumption() const
V8_EXPORT_PRIVATE WasmCode * MaybeGet(ImportCallKind kind, CanonicalTypeIndex type_index, int expected_arity, Suspend suspend) const
WasmCode * CompileWasmImportCallWrapper(Isolate *isolate, ImportCallKind kind, const CanonicalSig *sig, CanonicalTypeIndex sig_index, bool source_positions, int expected_arity, Suspend suspend)
void Free(std::vector< WasmCode * > &wrappers)
void LazyInitialize(Isolate *triggering_isolate)
WasmImportWrapperCache()=default
V8_EXPORT_PRIVATE WasmCode * FindWrapper(WasmCodePointer call_target)
std::map< Address, WasmCode * > codes_
std::unique_ptr< WasmCodeAllocator > code_allocator_
void LogForIsolate(Isolate *isolate)
SourcePositionTable * source_positions
ZoneVector< RpoNumber > & result
constexpr Vector< T > VectorOf(T *start, size_t size)
wasm::WasmCompilationResult CompileWasmImportCallWrapper(wasm::ImportCallKind kind, const wasm::CanonicalSig *sig, bool source_positions, int expected_arity, wasm::Suspend suspend)
V8_EXPORT_PRIVATE WasmCodePointerTable * GetProcessWideWasmCodePointerTable()
constexpr int kAnonymousFuncIndex
WasmCodeManager * GetWasmCodeManager()
constexpr WasmCodePointer kInvalidWasmCodePointer
size_t ContentSize(const std::vector< T > &vector)
WasmEngine * GetWasmEngine()
void FlushInstructionCache(void *start, size_t size)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define UPDATE_WHEN_CLASS_CHANGES(classname, size)