29constexpr uint8_t kLazyFunction = 2;
30constexpr uint8_t kEagerFunction = 3;
31constexpr uint8_t kTurboFanFunction = 4;
37 explicit Writer(base::Vector<uint8_t> buffer)
40 size_t bytes_written()
const {
return pos_ -
start_; }
41 uint8_t* current_location()
const {
return pos_; }
42 size_t current_size()
const {
return end_ -
pos_; }
43 base::Vector<uint8_t> current_buffer()
const {
44 return {current_location(), current_size()};
48 void Write(
const T& value) {
50 WriteUnalignedValue(
reinterpret_cast<Address>(current_location()), value);
52 if (
v8_flags.trace_wasm_serialization) {
53 StdoutStream{} <<
"wrote: " <<
static_cast<size_t>(
value)
54 <<
" sized: " <<
sizeof(T) << std::endl;
59 void WriteVector(
const base::Vector<T> v) {
63 memcpy(current_location(), bytes.begin(), bytes.size());
66 if (
v8_flags.trace_wasm_serialization) {
67 StdoutStream{} <<
"wrote vector of " << v.size()
68 <<
" elements (total size " << bytes.size() <<
" bytes)"
73 void Skip(
size_t size) {
pos_ +=
size; }
83 explicit Reader(base::Vector<const uint8_t> buffer)
84 :
start_(buffer.begin()),
end_(buffer.end()),
pos_(buffer.begin()) {}
86 size_t bytes_read()
const {
return pos_ -
start_; }
87 const uint8_t* current_location()
const {
return pos_; }
88 size_t current_size()
const {
return end_ -
pos_; }
89 base::Vector<const uint8_t> current_buffer()
const {
90 return {current_location(), current_size()};
97 ReadUnalignedValue<T>(
reinterpret_cast<Address>(current_location()));
99 if (
v8_flags.trace_wasm_serialization) {
100 StdoutStream{} <<
"read: " <<
static_cast<size_t>(
value)
101 <<
" sized: " <<
sizeof(T) << std::endl;
106 template <
typename T>
107 base::Vector<const T> ReadVector(
size_t size) {
109 base::Vector<const uint8_t> bytes{
pos_, size *
sizeof(
T)};
110 pos_ += size *
sizeof(
T);
111 if (
v8_flags.trace_wasm_serialization) {
112 StdoutStream{} <<
"read vector of " << size <<
" elements of size "
113 <<
sizeof(
T) <<
" (total size " << size *
sizeof(T) <<
")"
119 void Skip(
size_t size) {
pos_ +=
size; }
122 const uint8_t*
const start_;
123 const uint8_t*
const end_;
127void WriteHeader(Writer* writer, WasmEnabledFeatures enabled_features) {
133 writer->Write(enabled_features.ToIntegral());
142void SetWasmCalleeTag(WritableRelocInfo* rinfo, uint32_t tag) {
143#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32
144 DCHECK(rinfo->HasTargetAddressAddress());
146 WriteUnalignedValue(rinfo->target_address_address(), tag);
147#elif V8_TARGET_ARCH_ARM64
148 Instruction*
instr =
reinterpret_cast<Instruction*
>(rinfo->pc());
149 if (
instr->IsLdrLiteralX()) {
150 WriteUnalignedValue(rinfo->constant_pool_entry_address(),
155 reinterpret_cast<Instruction*
>(rinfo->pc() + tag *
kInstrSize));
157#elif V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_RISCV32
158 Instruction*
instr =
reinterpret_cast<Instruction*
>(rinfo->pc());
159 if (
instr->IsAUIPC()) {
161 Instr jalr =
reinterpret_cast<Instruction*
>(rinfo->pc() + 1 *
kInstrSize)
163 DCHECK(is_int32(tag + 0x800));
168 static_cast<Address>(tag),
nullptr,
176 rinfo->set_wasm_stub_call_address(addr);
183uint32_t GetWasmCalleeTag(RelocInfo* rinfo) {
184#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32
186 return ReadUnalignedValue<uint32_t>(rinfo->target_address_address());
187#elif V8_TARGET_ARCH_ARM64
188 Instruction*
instr =
reinterpret_cast<Instruction*
>(rinfo->pc());
189 if (
instr->IsLdrLiteralX()) {
190 return ReadUnalignedValue<uint32_t>(rinfo->constant_pool_entry_address());
195#elif V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_RISCV32
196 Instruction*
instr =
reinterpret_cast<Instruction*
>(rinfo->pc());
197 if (
instr->IsAUIPC()) {
199 Instr jalr =
reinterpret_cast<Instruction*
>(rinfo->pc() + 1 *
kInstrSize)
203 return static_cast<uint32_t
>(rinfo->target_address());
208 addr = rinfo->target_external_reference();
210 addr = rinfo->wasm_stub_call_address();
212 addr = rinfo->target_address();
214 return static_cast<uint32_t
>(addr);
218constexpr size_t kCodeHeaderSize =
sizeof(uint8_t) +
238class ExternalReferenceList {
240 ExternalReferenceList(
const ExternalReferenceList&) =
delete;
241 ExternalReferenceList& operator=(
const ExternalReferenceList&) =
delete;
243 uint32_t tag_from_address(
Address ext_ref_address)
const {
244 auto tag_addr_less_than = [
this](uint32_t tag,
Address searched_addr) {
247 auto it = std::lower_bound(std::begin(tags_ordered_by_address_),
248 std::end(tags_ordered_by_address_),
249 ext_ref_address, tag_addr_less_than);
250 DCHECK_NE(std::end(tags_ordered_by_address_), it);
252 DCHECK_EQ(address_from_tag(tag), ext_ref_address);
256 Address address_from_tag(uint32_t tag)
const {
261 static const ExternalReferenceList&
Get() {
262 static ExternalReferenceList list;
268 ExternalReferenceList() {
272 auto addr_by_tag_less_than = [
this](uint32_t
a, uint32_t b) {
275 std::sort(std::begin(tags_ordered_by_address_),
276 std::end(tags_ordered_by_address_), addr_by_tag_less_than);
279#define COUNT_EXTERNAL_REFERENCE(name, ...) +1
286#undef COUNT_EXTERNAL_REFERENCE
289#define EXT_REF_ADDR(name, desc) ExternalReference::name().address(),
292#define RUNTIME_ADDR(name, ...) \
293 ExternalReference::Create(Runtime::k##name).address(),
300static_assert(std::is_trivially_destructible_v<ExternalReferenceList>,
301 "static destructors not allowed");
312 size_t Measure()
const;
313 bool Write(Writer* writer);
316 size_t MeasureCode(
const WasmCode*)
const;
317 void WriteHeader(Writer*,
size_t total_code_size);
318 void WriteCode(
const WasmCode*, Writer*,
320 void WriteTieringBudget(Writer* writer);
322 uint32_t CanonicalSigIdToModuleLocalTypeId(uint32_t canonical_sig_id);
329 bool write_called_ =
false;
330 size_t total_written_code_ = 0;
331 int num_turbofan_functions_ = 0;
338 code_table_(code_table),
339 import_statuses_(import_statuses) {
346 if (code ==
nullptr)
return sizeof(uint8_t);
349 return sizeof(uint8_t);
351 return kCodeHeaderSize + code->instructions().size() +
352 code->reloc_info().size() + code->source_positions().size() +
353 code->inlining_positions().size() +
354 code->protected_instructions_data().size() + code->deopt_data().size();
373 size +=
native_module_->module()->num_declared_functions *
sizeof(uint32_t);
379 size_t total_code_size) {
390 native_module_->compilation_state()->detected_features().ToIntegral());
392 writer->Write(total_code_size);
397 const bool fully_validated = !
v8_flags.wasm_lazy_validation;
398 writer->Write(fully_validated);
400 if (fully_validated) {
411 writer->Write(
static_cast<uint32_t
>(constants_module.size()));
417 const WasmCode* code, Writer* writer,
419 if (code ==
nullptr) {
420 writer->Write(kLazyFunction);
434 uint32_t budget = native_module
436 native_module->
module(), code->index())]
437 .load(std::memory_order_relaxed);
438 writer->Write(budget ==
static_cast<uint32_t
>(
v8_flags.wasm_tiering_budget)
445 writer->Write(kTurboFanFunction);
447 writer->Write(code->constant_pool_offset());
448 writer->Write(code->safepoint_table_offset());
449 writer->Write(code->handler_table_offset());
450 writer->Write(code->code_comments_offset());
451 writer->Write(code->unpadded_binary_size());
452 writer->Write(code->stack_slots());
453 writer->Write(code->ool_spills());
454 writer->Write(code->raw_tagged_parameter_slots_for_serialization());
455 writer->Write(code->instructions().length());
456 writer->Write(code->reloc_info().length());
457 writer->Write(code->source_positions().length());
458 writer->Write(code->inlining_positions().length());
459 writer->Write(code->deopt_data().length());
460 writer->Write(code->protected_instructions_data().length());
461 writer->Write(code->kind());
462 writer->Write(code->tier());
465 uint8_t* serialized_code_start = writer->current_buffer().begin();
466 uint8_t* code_start = serialized_code_start;
467 size_t code_size = code->instructions().size();
468 writer->Skip(code_size);
471 writer->WriteVector(code->reloc_info());
472 writer->WriteVector(code->source_positions());
473 writer->WriteVector(code->inlining_positions());
474 writer->WriteVector(code->deopt_data());
475 writer->WriteVector(code->protected_instructions_data());
476#if V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_PPC64 || \
477 V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_RISCV32 || V8_TARGET_ARCH_RISCV64
480 std::unique_ptr<uint8_t[]> aligned_buffer;
485 aligned_buffer.reset(
new uint8_t[code_size]);
486 code_start = aligned_buffer.get();
489 memcpy(code_start, code->instructions().begin(), code_size);
491 constexpr int kMask =
499 RelocIterator orig_iter(code->instructions(), code->reloc_info(),
500 code->constant_pool(), kMask);
504 reinterpret_cast<Address>(code_start), code->instructions().size(),
507 jit_allocation, {code_start, code->instructions().size()},
509 reinterpret_cast<Address>(code_start) + code->constant_pool_offset(),
511 !iter.
done(); iter.next(), orig_iter.
next()) {
518 SetWasmCalleeTag(iter.rinfo(), tag);
522 uint32_t tag =
static_cast<uint32_t
>(
524 SetWasmCalleeTag(iter.rinfo(), tag);
528 uint32_t module_local_sig_id =
530 iter.rinfo()->set_wasm_canonical_sig_id(module_local_sig_id);
535 uint32_t function_index = function_index_map.at(target);
536 iter.rinfo()->set_wasm_code_pointer_table_entry(
541 uint32_t ext_ref_tag =
542 ExternalReferenceList::Get().tag_from_address(orig_target);
543 SetWasmCalleeTag(iter.rinfo(), ext_ref_tag);
550 iter.rinfo()->pc(),
offset, jit_allocation, mode);
557 if (code_start != serialized_code_start) {
558 memcpy(serialized_code_start, code_start, code_size);
567 std::memory_order_relaxed));
572 uint32_t canonical_sig_id) {
576 size_t num_types =
module->types.size();
578 for (uint32_t local_id = 0; local_id < num_types; ++local_id) {
582 module->canonical_sig_id(ModuleTypeIndex{local_id});
587 std::make_pair(canonical_id.
index, local_id));
599 size_t total_code_size = 0;
603 total_code_size += code->instructions().size();
611 WriteCode(code, writer, function_index_map);
641 if (buffer.
size() < measured_size)
return false;
643 Writer writer(buffer);
646 if (!serializer.
Write(&writer))
return false;
647 DCHECK_EQ(measured_size, writer.bytes_written());
653 std::unique_ptr<WasmCode>
code;
659 void Add(std::vector<DeserializationUnit> batch) {
662 queue_.emplace(std::move(batch));
665 std::vector<DeserializationUnit>
Pop() {
667 if (
queue_.empty())
return {};
668 auto batch = std::move(
queue_.front());
673 std::vector<DeserializationUnit>
PopAll() {
675 if (
queue_.empty())
return {};
680 std::make_move_iterator(
queue_.front().end()));
693 std::queue<std::vector<DeserializationUnit>>
queue_;
702 bool Read(Reader* reader);
705 return base::VectorOf(lazy_functions_);
709 return base::VectorOf(eager_functions_);
715 void ReadHeader(Reader* reader);
717 void ReadTieringBudget(Reader* reader);
719 void Publish(std::vector<DeserializationUnit> batch);
723 bool read_called_ =
false;
727 size_t remaining_code_size_ = 0;
728 bool all_functions_validated_ =
false;
743 bool finished =
false;
749 if (batch.empty())
break;
750 for (
const auto&
unit : batch) {
761 bool publish =
publishing_.load(std::memory_order_relaxed) ==
false &&
769 if (
publishing_.exchange(
true, std::memory_order_relaxed))
return false;
776 if (to_publish.empty())
break;
780 publishing_.store(
false, std::memory_order_relaxed);
781 if (yield)
return true;
785 if (
publishing_.exchange(
true, std::memory_order_relaxed))
break;
826 std::make_unique<DeserializeCodeTask>(
this, &reloc_queue));
830 constexpr size_t kMinBatchSizeInBytes = 100000;
834 std::vector<DeserializationUnit> batch;
835 size_t batch_size = 0;
836 for (uint32_t
i = first_wasm_fn;
i < total_fns; ++
i) {
838 if (!
unit.code)
continue;
839 batch_size +=
unit.code->instructions().size();
840 batch.emplace_back(std::move(
unit));
841 if (batch_size >= batch_limit) {
842 reloc_queue.
Add(std::move(batch));
845 job_handle->NotifyConcurrencyIncrease();
854 if (!batch.empty()) {
855 reloc_queue.
Add(std::move(batch));
856 job_handle->NotifyConcurrencyIncrease();
863 return reader->current_size() == 0;
878 auto compile_imports_flags =
880 uint32_t constants_module_size = reader->Read<uint32_t>();
882 reader->ReadVector<
char>(constants_module_size);
884 constants_module_data);
897 uint8_t code_kind = reader->Read<uint8_t>();
898 if (code_kind == kLazyFunction) {
902 if (code_kind == kEagerFunction) {
907 int constant_pool_offset = reader->Read<
int>();
908 int safepoint_table_offset = reader->Read<
int>();
909 int handler_table_offset = reader->Read<
int>();
910 int code_comment_offset = reader->Read<
int>();
911 int unpadded_binary_size = reader->Read<
int>();
912 int stack_slot_count = reader->Read<
int>();
913 int ool_spill_count = reader->Read<
int>();
914 uint32_t tagged_parameter_slots = reader->Read<uint32_t>();
915 int code_size = reader->Read<
int>();
916 int reloc_size = reader->Read<
int>();
917 int source_position_size = reader->Read<
int>();
918 int inlining_position_size = reader->Read<
int>();
919 int deopt_data_size = reader->Read<
int>();
922 int protected_instructions_size = reader->Read<
int>();
932 v8_flags.wasm_max_code_space_size_mb * MB * 9 / 10);
942 auto reloc_info = reader->ReadVector<uint8_t>(reloc_size);
943 auto source_pos = reader->ReadVector<uint8_t>(source_position_size);
944 auto inlining_pos = reader->ReadVector<uint8_t>(inlining_position_size);
945 auto deopt_data = reader->ReadVector<uint8_t>(deopt_data_size);
946 auto protected_instructions =
947 reader->ReadVector<uint8_t>(protected_instructions_size);
955 fn_index, instructions, stack_slot_count, ool_spill_count,
956 tagged_parameter_slots, safepoint_table_offset, handler_table_offset,
957 constant_pool_offset, code_comment_offset, unpadded_binary_size,
958 protected_instructions, reloc_info, source_pos, inlining_pos, deopt_data,
967 reinterpret_cast<Address>(
unit.code->instructions().begin()),
968 unit.code->instructions().size(),
971 jit_allocation.
CopyCode(0,
unit.src_code_buffer.begin(),
972 unit.src_code_buffer.size());
983 unit.code->reloc_info(),
984 unit.code->constant_pool(), kMask);
985 !iter.
done(); iter.next()) {
989 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
992 iter.rinfo()->set_wasm_call_address(target);
996 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
999 iter.rinfo()->set_wasm_stub_call_address(target);
1009 iter.rinfo()->wasm_canonical_sig_id()};
1012 iter.rinfo()->set_wasm_canonical_sig_id(canonical_sig_id.
index);
1016 iter.rinfo()->wasm_code_pointer_table_entry().value();
1018 base::checked_cast<uint32_t>(function_index));
1019 iter.rinfo()->set_wasm_code_pointer_table_entry(target,
1023 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
1024 Address address = ExternalReferenceList::Get().address_from_tag(tag);
1033 iter.rinfo()->pc(), target, jit_allocation, mode);
1043 unit.code->instructions().size());
1047 size_t size_of_tiering_budget =
1049 if (size_of_tiering_budget > reader->current_size()) {
1053 reader->ReadVector<
const uint8_t>(size_of_tiering_budget);
1056 size_of_tiering_budget);
1061 std::vector<UnpublishedWasmCode> codes;
1062 codes.reserve(batch.size());
1063 for (
auto&
unit : batch) {
1068 std::move(
unit).code, std::unique_ptr<AssumptionsJournal>{
1072 for (
auto* wasm_code : published_codes) {
1073 wasm_code->MaybePrint();
1074 wasm_code->Validate();
1105 enabled_features, owned_wire_bytes.
as_vector(),
false,
1106 i::wasm::kWasmOrigin, isolate->counters(), isolate->metrics_recorder(),
1107 isolate->GetOrRegisterRecorderContextId(isolate->native_context()),
1109 if (decode_result.
failed())
return {};
1110 std::shared_ptr<WasmModule> module = std::move(decode_result).value();
1115 module->origin, owned_wire_bytes.
as_vector(), compile_imports, isolate);
1116 if (shared_native_module ==
nullptr) {
1117 size_t code_size_estimate =
1120 isolate, enabled_features, detected_features, compile_imports,
1121 std::move(module), code_size_estimate);
1127 shared_native_module->compilation_state()->set_compilation_id(-2);
1128 shared_native_module->SetWireBytes(std::move(owned_wire_bytes));
1132 bool error = !deserializer.
Read(&reader);
1135 error, std::move(shared_native_module), isolate);
1138 shared_native_module->compilation_state()->InitializeAfterDeserialization(
1144 shared_native_module->compilation_state()->detected_features();
1154 isolate->debug()->OnAfterCompile(script);
1157 shared_native_module->LogWasmCodes(isolate, *script);
1159 return module_object;
virtual void NotifyConcurrencyIncrease()=0
virtual bool ShouldYield()=0
static constexpr EnumSet FromIntegral(int bits)
constexpr T ToIntegral() const
Vector< T > as_vector() const
Vector< T > SubVector(size_t from, size_t to) const
constexpr size_t size() const
constexpr T * begin() const
static Vector< T > cast(Vector< S > input)
static void deserialization_set_target_internal_reference_at(Address pc, Address target, WritableJitAllocation &jit_allocation, RelocInfo::Mode mode=RelocInfo::INTERNAL_REFERENCE)
static V8_INLINE void set_target_address_at(Address pc, Address constant_pool, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
static int PatchBranchlongOffset(Address pc, Instr auipc, Instr instr_I, int32_t offset, WritableJitAllocation *jit_allocation=nullptr)
static int BrachlongOffset(Instr auipc, Instr jalr)
static unsigned SupportedFeatures()
V8_INLINE Address target_internal_reference()
static constexpr int ModeMask(Mode mode)
static constexpr bool IsCompressedEmbeddedObject(Mode mode)
V8_EXPORT_PRIVATE uint32_t wasm_canonical_sig_id() const
V8_INLINE WasmCodePointer wasm_code_pointer_table_entry() const
V8_INLINE Address target_external_reference()
Address wasm_call_address() const
@ WASM_CODE_POINTER_TABLE_ENTRY
@ INTERNAL_REFERENCE_ENCODED
Address wasm_stub_call_address() const
static constexpr uint32_t kMagicNumber
static WritableJitAllocation RegisterJitAllocation(Address addr, size_t size, JitAllocationType type, bool enforce_write_api=false)
static V8_EXPORT_PRIVATE v8::Platform * GetCurrentPlatform()
static V8_EXPORT_PRIVATE DirectHandle< WasmModuleObject > New(Isolate *isolate, std::shared_ptr< wasm::NativeModule > native_module, DirectHandle< Script > script)
static V8_INLINE WritableJitAllocation ForNonExecutableMemory(Address addr, size_t size, ThreadIsolation::JitAllocationType type)
V8_INLINE void CopyCode(size_t dst_offset, const uint8_t *src, size_t num_bytes)
V8_WARN_UNUSED_RESULT WasmDetectedFeatures UpdateDetectedFeatures(WasmDetectedFeatures)
CompileTimeImportFlags flags() const
static CompileTimeImports FromSerialized(CompileTimeImportFlags::StorageType flags, base::Vector< const char > constants_module)
std::string & constants_module()
int compare(const CompileTimeImports &other) const
std::vector< DeserializationUnit > PopAll()
std::queue< std::vector< DeserializationUnit > > queue_
void Add(std::vector< DeserializationUnit > batch)
size_t NumBatches() const
std::vector< DeserializationUnit > Pop()
DeserializeCodeTask(NativeModuleDeserializer *deserializer, DeserializationQueue *reloc_queue)
NativeModuleDeserializer *const deserializer_
void Run(JobDelegate *delegate) override
std::atomic< bool > publishing_
DeserializationQueue *const reloc_queue_
DeserializationQueue publish_queue_
size_t GetMaxConcurrency(size_t) const override
bool TryPublishing(JobDelegate *delegate)
bool Read(Reader *reader)
DeserializationUnit ReadCode(int fn_index, Reader *reader)
NativeModuleDeserializer(const NativeModuleDeserializer &)=delete
base::Vector< uint8_t > current_code_space_
NativeModule::JumpTablesRef current_jump_tables_
void CopyAndRelocate(const DeserializationUnit &unit)
void ReadHeader(Reader *reader)
CompileTimeImports compile_imports_
NativeModuleDeserializer & operator=(const NativeModuleDeserializer &)=delete
NativeModule *const native_module_
NativeModuleDeserializer(NativeModule *)
std::vector< int > lazy_functions_
void ReadTieringBudget(Reader *reader)
base::Vector< const int > eager_functions()
base::Vector< const int > lazy_functions()
bool all_functions_validated_
size_t remaining_code_size_
std::vector< int > eager_functions_
void Publish(std::vector< DeserializationUnit > batch)
size_t total_written_code_
uint32_t CanonicalSigIdToModuleLocalTypeId(uint32_t canonical_sig_id)
void WriteHeader(Writer *, size_t total_code_size)
const NativeModule *const native_module_
void WriteTieringBudget(Writer *writer)
bool Write(Writer *writer)
NativeModuleSerializer(const NativeModule *, base::Vector< WasmCode *const >, base::Vector< WellKnownImport const >)
NativeModuleSerializer & operator=(const NativeModuleSerializer &)=delete
NativeModuleSerializer(const NativeModuleSerializer &)=delete
const base::Vector< WellKnownImport const > import_statuses_
std::unordered_map< uint32_t, uint32_t > canonical_sig_ids_to_module_local_ids_
size_t MeasureCode(const WasmCode *) const
int num_turbofan_functions_
const base::Vector< WasmCode *const > code_table_
void WriteCode(const WasmCode *, Writer *, const NativeModule::CallIndirectTargetMap &)
CompilationState * compilation_state() const
Address GetNearCallTargetForFunction(uint32_t func_index, const JumpTablesRef &) const
std::atomic< uint32_t > * tiering_budget_array() const
uint32_t num_functions() const
std::pair< std::vector< WasmCode * >, std::vector< WellKnownImport > > SnapshotCodeTable() const
const WasmModule * module() const
std::pair< base::Vector< uint8_t >, JumpTablesRef > AllocateForDeserializedCode(size_t total_code_size)
WasmCodePointer GetCodePointerHandle(int index) const
Address GetJumpTableEntryForBuiltin(Builtin builtin, const JumpTablesRef &) const
std::unique_ptr< WasmCode > AddDeserializedCode(int index, base::Vector< uint8_t > instructions, int stack_slots, int ool_spills, uint32_t tagged_parameter_slots, int safepoint_table_offset, int handler_table_offset, int constant_pool_offset, int code_comments_offset, int unpadded_binary_size, base::Vector< const uint8_t > protected_instructions_data, base::Vector< const uint8_t > reloc_info, base::Vector< const uint8_t > source_position_table, base::Vector< const uint8_t > inlining_positions, base::Vector< const uint8_t > deopt_data, WasmCode::Kind kind, ExecutionTier tier)
WasmCode * PublishCode(UnpublishedWasmCode)
absl::flat_hash_map< WasmCodePointer, uint32_t > CallIndirectTargetMap
WasmEnabledFeatures enabled_features() const
const CompileTimeImports & compile_imports() const
uint32_t num_imported_functions() const
static size_t EstimateNativeModuleCodeSize(const WasmModule *)
static V8_EXPORT_PRIVATE WasmEnabledFeatures FromIsolate(Isolate *)
std::shared_ptr< NativeModule > MaybeGetNativeModule(ModuleOrigin origin, base::Vector< const uint8_t > wire_bytes, const CompileTimeImports &compile_imports, Isolate *isolate)
DirectHandle< Script > GetOrCreateScript(Isolate *, const std::shared_ptr< NativeModule > &, base::Vector< const char > source_url)
std::shared_ptr< NativeModule > NewNativeModule(Isolate *isolate, WasmEnabledFeatures enabled_features, WasmDetectedFeatures detected_features, CompileTimeImports compile_imports, std::shared_ptr< const WasmModule > module, size_t code_size_estimate)
std::shared_ptr< NativeModule > UpdateNativeModuleCache(bool has_error, std::shared_ptr< NativeModule > native_module, Isolate *isolate)
std::vector< WasmCode * > code_table_
NativeModule * native_module_
static constexpr size_t kHeaderSize
size_t GetSerializedNativeModuleSize() const
std::vector< WellKnownImport > import_statuses_
bool SerializeNativeModule(base::Vector< uint8_t > buffer) const
WasmSerializer(NativeModule *native_module)
const v8::base::TimeTicks end_
#define COUNT_EXTERNAL_REFERENCE(name, desc)
#define EXTERNAL_REFERENCE_LIST(V)
std::optional< TNode< JSArray > > a
std::shared_ptr< NativeModule > native_module_
std::priority_queue< BigUnit > units[CompilationTier::kNumTiers]
constexpr Vector< T > VectorOf(T *start, size_t size)
OwnedVector< T > OwnedCopyOf(const T *data, size_t size)
Node::Uses::const_iterator begin(const Node::Uses &uses)
ModuleResult DecodeWasmModule(WasmEnabledFeatures enabled_features, base::Vector< const uint8_t > wire_bytes, bool validate_functions, ModuleOrigin origin, Counters *counters, std::shared_ptr< metrics::Recorder > metrics_recorder, v8::metrics::Recorder::ContextId context_id, DecodingMethod decoding_method, WasmDetectedFeatures *detected_features)
MaybeDirectHandle< WasmModuleObject > DeserializeNativeModule(Isolate *isolate, base::Vector< const uint8_t > data, base::Vector< const uint8_t > wire_bytes_vec, const CompileTimeImports &compile_imports, base::Vector< const char > source_url)
WireBytesRef Get(const NameMap &map, uint32_t index)
WasmEngine * GetWasmEngine()
int declared_function_index(const WasmModule *module, int func_index)
void PublishDetectedFeatures(WasmDetectedFeatures detected_features, Isolate *isolate, bool is_initial_compilation)
bool IsWasmCodegenAllowed(Isolate *isolate, DirectHandle< NativeContext > context)
bool IsSupportedVersion(base::Vector< const uint8_t > header, WasmEnabledFeatures enabled_features)
static void WriteHeader(std::ostream &os, const char *compiler)
void FlushInstructionCache(void *start, size_t size)
constexpr intptr_t kCodeAlignment
constexpr int kSystemPointerSize
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr uint8_t kInstrSize
constexpr uint32_t kMaxUInt32
#define FOR_EACH_INTRINSIC(F)
#define DCHECK_NOT_NULL(val)
#define CHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
#define V8_EXPORT_PRIVATE
constexpr bool IsAligned(T value, U alignment)
std::unique_ptr< WasmCode > code
NativeModule::JumpTablesRef jump_tables
base::Vector< const uint8_t > src_code_buffer
static constexpr AssumptionsJournal * kNoAssumptions
base::Vector< const WasmFunction > declared_functions() const
std::vector< CanonicalTypeIndex > isorecursive_canonical_type_ids
bool has_signature(ModuleTypeIndex index) const
bool function_was_validated(int func_index) const
#define EXT_REF_ADDR(name, desc)
uint32_t tags_ordered_by_address_[kNumExternalReferences]
static constexpr uint32_t kNumExternalReferences
static constexpr uint32_t kNumExternalReferencesList
static constexpr uint32_t kNumExternalReferencesIntrinsics
Address external_reference_by_tag_[kNumExternalReferences]
#define RUNTIME_ADDR(name,...)