31 std::numeric_limits<
decltype(TypeDefinition().subtyping_depth)>::max());
38 for (
const auto& entry : *
map_) {
40 max = std::max(max, entry.first);
42 if (
count >= (max + 1) / kLoadFactor) {
45 for (
auto& entry : *
map_) {
46 vector_[entry.first] = std::move(entry.second);
76 const std::vector<WasmFunction>& functions =
module->functions;
77 if (
static_cast<uint32_t
>(func_index) >= functions.size())
return -1;
79 return static_cast<int>(functions[func_index].code.offset());
84 const std::vector<WasmFunction>& functions =
module->functions;
88 int right =
static_cast<int>(functions.size());
89 if (right == 0)
return -1;
90 while (right - left > 1) {
91 int mid = left + (right - left) / 2;
92 if (functions[mid].code.offset() <= byte_offset) {
106 if (func_index >= 0) {
108 const WasmFunction& func =
module->functions[func_index];
119 int depth =
module->type(type_index).subtyping_depth;
132 : encoded_offsets_(
base::OwnedCopyOf(encoded_offsets)) {}
138 bool is_at_number_conversion) {
143 std::vector<AsmJsOffsetEntry>& function_offsets =
148 return a.byte_offset < b.byte_offset;
150 SLOW_DCHECK(std::is_sorted(function_offsets.begin(), function_offsets.end(),
154 if (function_offsets.empty() && byte_offset == 0)
return 0;
156 std::lower_bound(function_offsets.begin(), function_offsets.end(),
160 return is_at_number_conversion ? it->source_position_number_conversion
161 : it->source_position_call;
165 int declared_func_index) {
189 if (!ref.
is_set())
return {
nullptr, 0};
203 os <<
"#" << name.func_index_;
204 if (!name.name_.empty()) {
205 if (name.name_.begin()) {
207 os.write(name.name_.begin(), name.name_.length());
216 : signature_zone(
GetWasmEngine()->allocator(),
"signature zone"),
220 uint32_t function_index)
const {
221 if (function_index >= functions.size()) {
237 if (
auto wasm_codegen_callback = isolate->allow_wasm_code_gen_callback()) {
238 return wasm_codegen_callback(
239 v8::Utils::ToLocal(context),
240 v8::Utils::ToLocal(isolate->factory()->empty_string()));
257 return isolate->factory()->InternalizeUtf8String(
base::VectorOf(type.name()));
263 bool for_exception) {
264 Factory* factory = isolate->factory();
268 int param_count =
static_cast<int>(
sig->parameter_count());
272 param_values->set(param_index++, *type_value);
289 int result_index = 0;
290 int result_count =
static_cast<int>(
sig->return_count());
295 result_values->set(result_index++, *type_value);
307 Factory* factory = isolate->factory();
317 ToValueTypeString(isolate, type),
NONE);
323 std::optional<uint64_t> max_size,
325 Factory* factory = isolate->factory();
338 if (max_size.has_value()) {
352 isolate,
object, address_string,
360 std::optional<uint64_t> max_size,
362 Factory* factory = isolate->factory();
379 if (max_size.has_value()) {
390 isolate,
object, address_string,
398 auto enabled_features = i::wasm::WasmEnabledFeatures::FromIsolate(isolate);
399 Factory* factory = isolate->factory();
413 NativeModule* native_module = module_object->native_module();
415 int num_imports =
static_cast<int>(
module->import_table.size());
422 isolate->native_context()->object_function(), isolate);
426 module->type_feedback.well_known_imports;
427 const std::string& magic_string_constants =
429 const bool has_magic_string_constants =
434 for (
int index = 0; index < num_imports; ++
index) {
435 const WasmImport&
import = module->import_table[index];
441 switch (
import.
kind) {
446 if (enabled_features.has_type_reflection()) {
447 auto& func =
module->functions[import.index];
450 import_kind = function_string;
453 if (enabled_features.has_type_reflection()) {
454 auto& table =
module->tables[import.index];
455 std::optional<uint32_t> maximum_size;
456 if (table.has_maximum_size) maximum_size.emplace(table.maximum_size);
458 maximum_size, table.address_type);
460 import_kind = table_string;
463 if (enabled_features.has_type_reflection()) {
464 auto& memory =
module->memories[import.index];
465 std::optional<uint32_t> maximum_size;
466 if (memory.has_maximum_pages) {
467 maximum_size.emplace(memory.maximum_pages);
471 memory.is_shared, memory.address_type);
473 import_kind = memory_string;
476 if (has_magic_string_constants &&
477 import.module_name.length() == magic_string_constants.size() &&
478 std::equal(magic_string_constants.begin(),
479 magic_string_constants.end(),
480 module_object->native_module()->wire_bytes().begin() +
481 import.module_name.offset())) {
484 if (enabled_features.has_type_reflection()) {
485 auto& global =
module->globals[import.index];
489 import_kind = global_string;
492 import_kind = tag_string;
499 isolate, module_object,
import.module_name,
kInternalize);
503 isolate, module_object,
import.field_name,
kInternalize);
512 storage->set(cursor++, *entry);
521 auto enabled_features = i::wasm::WasmEnabledFeatures::FromIsolate(isolate);
522 Factory* factory = isolate->factory();
535 const WasmModule* module = module_object->module();
536 int num_exports =
static_cast<int>(
module->export_table.size());
544 isolate->native_context()->object_function(), isolate);
547 for (
int index = 0; index < num_exports; ++
index) {
548 const WasmExport& exp =
module->export_table[index];
554 if (enabled_features.has_type_reflection()) {
555 auto& func =
module->functions[exp.index];
558 export_kind = function_string;
561 if (enabled_features.has_type_reflection()) {
562 auto& table =
module->tables[exp.index];
563 std::optional<uint32_t> maximum_size;
564 if (table.has_maximum_size) maximum_size.emplace(table.maximum_size);
566 maximum_size, table.address_type);
568 export_kind = table_string;
571 if (enabled_features.has_type_reflection()) {
572 auto& memory =
module->memories[exp.index];
573 std::optional<uint32_t> maximum_size;
574 if (memory.has_maximum_pages) {
575 maximum_size.emplace(memory.maximum_pages);
579 memory.is_shared, memory.address_type);
581 export_kind = memory_string;
584 if (enabled_features.has_type_reflection()) {
585 auto& global =
module->globals[exp.index];
589 export_kind = global_string;
592 export_kind = tag_string;
610 storage->set(index, *entry);
619 Factory* factory = isolate->factory();
622 module_object->native_module()->wire_bytes();
623 std::vector<CustomSectionOffset> custom_sections =
629 for (
auto& section : custom_sections) {
634 if (!name->Equals(*section_name))
continue;
637 size_t size = section.payload.length();
639 isolate->factory()->NewJSArrayBufferAndBackingStore(
642 if (!
result.ToHandle(&array_buffer)) {
643 thrower->RangeError(
"out of memory allocating custom section data");
646 memcpy(array_buffer->backing_store(),
647 wire_bytes.
begin() + section.payload.offset(),
648 section.payload.length());
650 matching_sections.
push_back(array_buffer);
653 int num_custom_sections =
static_cast<int>(matching_sections.
size());
659 array_object->set_length(
Smi::FromInt(num_custom_sections));
661 for (
int i = 0;
i < num_custom_sections;
i++) {
662 storage->set(
i, *matching_sections[
i]);
671 uint32_t byte_offset,
bool is_at_number_conversion) {
681 return module->asm_js_offset_information->GetSourcePosition(
682 declared_function_index(module, func_index), byte_offset,
683 is_at_number_conversion);
688#
if V8_ENABLE_DRUMBRAKE
714template <
class Value>
734 for (
const auto& inner_map :
vector_) {
735 result += inner_map.EstimateCurrentMemoryConsumption();
739 for (
const auto& [outer_index, inner_map] : *
map_) {
740 result += inner_map.EstimateCurrentMemoryConsumption();
754 result += feedback.call_targets.size() *
sizeof(uint32_t);
759 if (
v8_flags.trace_wasm_offheap_memory) {
767#
if V8_ENABLE_DRUMBRAKE
781 if (
v8_flags.trace_wasm_offheap_memory) {
789 if (buffer.
empty())
return 0;
790 size_t old_size = buffer.
size();
791 auto append_char = [&buffer](
char c) {
792 if (buffer.
size() == 1)
return;
797 append_char(t.short_name());
799 append_char(delimiter);
801 append_char(t.short_name());
804 return old_size - buffer.
size();
814 reinterpret_cast<const char*
>(wire_bytes.
begin()), wire_bytes.
length(),
820 auto it =
module->type_feedback.feedback_for_function.find(func_index);
823 static_assert(kV8MaxWasmFunctionSize < std::numeric_limits<int>::max() / 2);
824 return static_cast<int>(2 * it->second.call_targets.size());
#define SLOW_DCHECK(condition)
std::unique_ptr< T[]> ReleaseData()
Vector< T > as_vector() const
Vector< T > SubVector(size_t from, size_t to) const
constexpr bool empty() const
constexpr size_t size() const
constexpr T * begin() const
static Vector< const char > cast(Vector< S > input)
static V8_EXPORT_PRIVATE Handle< BigInt > FromUint64(Isolate *isolate, uint64_t n)
void push_back(const DirectHandle< T > &x)
size_t size() const noexcept
V8_INLINE bool is_null() const
Handle< Boolean > ToBoolean(bool value)
Handle< Number > NewNumberFromUint(uint32_t value)
Handle< FixedArray > NewFixedArray(int length, AllocationType allocation=AllocationType::kYoung)
Handle< JSArray > NewJSArray(ElementsKind elements_kind, int length, int capacity, ArrayStorageAllocationMode mode=ArrayStorageAllocationMode::DONT_INITIALIZE_ARRAY_ELEMENTS, AllocationType allocation=AllocationType::kYoung)
Handle< JSObject > NewJSObject(DirectHandle< JSFunction > constructor, AllocationType allocation=AllocationType::kYoung, NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
Handle< JSArray > NewJSArrayWithElements(DirectHandle< FixedArrayBase > elements, ElementsKind elements_kind, int length, AllocationType allocation=AllocationType::kYoung)
Handle< String > InternalizeUtf8String(base::Vector< const char > str)
static void SetContent(DirectHandle< JSArray > array, DirectHandle< FixedArrayBase > storage)
static V8_EXPORT_PRIVATE void AddProperty(Isolate *isolate, DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes)
static V8_EXPORT_PRIVATE DirectHandle< String > NoSideEffectsToString(Isolate *isolate, DirectHandle< Object > input)
static constexpr Tagged< Smi > FromInt(int value)
static uint32_t HashSequentialString(const char_t *chars, uint32_t length, uint64_t seed)
static DirectHandle< String > ExtractUtf8StringFromModuleBytes(Isolate *, DirectHandle< WasmModuleObject >, wasm::WireBytesRef, InternalizeString)
size_t allocation_size_for_tracing() const
void Put(uint32_t key, const Value &value)
size_t EstimateCurrentMemoryConsumption() const
const Value * Get(uint32_t key) const
std::unique_ptr< MapType > map_
std::vector< Value > vector_
void FinishInitialization()
static uint32_t JumpSlotIndexToOffset(uint32_t slot_index)
WireBytesRef LookupFunctionName(ModuleWireBytes wire_bytes, uint32_t function_index)
size_t EstimateCurrentMemoryConsumption() const
bool Has(uint32_t function_index)
void AddForTesting(int function_index, WireBytesRef name)
const WasmModule * module() const
const CompileTimeImports & compile_imports() const
V8_EXPORT_PRIVATE const CanonicalSig * LookupFunctionSignature(CanonicalTypeIndex index) const
WellKnownImport get(int index) const
uint32_t end_offset() const
RecordWriteMode const mode_
std::optional< TNode< JSArray > > a
ZoneVector< RpoNumber > & result
constexpr Vector< T > VectorOf(T *start, size_t size)
bool IsCompileTimeImport(WellKnownImport wki)
DirectHandle< JSObject > GetTypeForTable(Isolate *isolate, ValueType type, uint32_t min_size, std::optional< uint64_t > max_size, AddressType address_type)
size_t PrintSignature(base::Vector< char > buffer, const CanonicalSig *sig, char delimiter)
int GetSubtypingDepth(const WasmModule *module, ModuleTypeIndex type_index)
DirectHandle< JSObject > GetTypeForMemory(Isolate *isolate, uint32_t min_size, std::optional< uint64_t > max_size, bool shared, AddressType address_type)
void DecodeFunctionNames(base::Vector< const uint8_t > wire_bytes, NameMap &names)
int GetWasmFunctionOffset(const WasmModule *module, uint32_t func_index)
int JumpTableOffset(const WasmModule *module, int func_index)
int GetContainingWasmFunction(const WasmModule *module, uint32_t byte_offset)
bool is_asmjs_module(const WasmModule *module)
size_t GetWireBytesHash(base::Vector< const uint8_t > wire_bytes)
DirectHandle< JSArray > GetImports(Isolate *isolate, DirectHandle< WasmModuleObject > module_object)
AsmJsOffsetsResult DecodeAsmJsOffsets(base::Vector< const uint8_t > encoded_offsets)
constexpr const char * AddressTypeToStr(AddressType address_type)
int GetSourcePosition(const WasmModule *module, uint32_t func_index, uint32_t byte_offset, bool is_at_number_conversion)
int GetNearestWasmFunction(const WasmModule *module, uint32_t byte_offset)
size_t ContentSize(const std::vector< T > &vector)
constexpr uint32_t kV8MaxRttSubtypingDepth
WasmEngine * GetWasmEngine()
int declared_function_index(const WasmModule *module, int func_index)
DirectHandle< JSArray > GetExports(Isolate *isolate, DirectHandle< WasmModuleObject > module_object)
DirectHandle< JSArray > GetCustomSections(Isolate *isolate, DirectHandle< WasmModuleObject > module_object, DirectHandle< String > name, ErrorThrower *thrower)
std::ostream & operator<<(std::ostream &os, LiftoffVarState slot)
DirectHandle< JSObject > GetTypeForFunction(Isolate *isolate, const FunctionSig *sig, bool for_exception)
std::vector< CustomSectionOffset > DecodeCustomSections(base::Vector< const uint8_t > bytes)
DirectHandle< String > ErrorStringForCodegen(Isolate *isolate, DirectHandle< Context > context)
bool IsWasmCodegenAllowed(Isolate *isolate, DirectHandle< NativeContext > context)
int NumFeedbackSlots(const WasmModule *module, int func_index)
DirectHandle< JSObject > GetTypeForGlobal(Isolate *isolate, bool is_mutable, ValueType type)
void PrintF(const char *format,...)
wasm::WasmModule WasmModule
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
static const uint64_t kZeroHashSeed
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr uint64_t kInvalidWasmSignatureHash
constexpr uint32_t kMaxUInt32
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
#define UPDATE_WHEN_CLASS_CHANGES(classname, size)
bool BoundsCheck(WireBytesRef ref) const
base::Vector< const uint8_t > module_bytes_
WasmName GetNameOrNull(WireBytesRef ref) const
base::Vector< const uint8_t > module_bytes() const
std::unordered_map< uint32_t, FunctionTypeFeedback > feedback_for_function
size_t EstimateCurrentMemoryConsumption() const
std::unordered_map< uint32_t, uint32_t > deopt_count_for_function
LazilyGeneratedNames lazily_generated_names
std::vector< TypeDefinition > types
std::vector< CanonicalTypeIndex > isorecursive_canonical_type_ids
CanonicalTypeIndex canonical_type_id(ModuleTypeIndex index) const
std::vector< WasmMemory > memories
std::unique_ptr< AsmJsOffsetInformation > asm_js_offset_information
std::vector< WasmExport > export_table
std::vector< WasmElemSegment > elem_segments
std::vector< WasmImport > import_table
std::vector< WasmStringRefLiteral > stringref_literals
uint64_t signature_hash(const TypeCanonicalizer *, uint32_t function_index) const
uint32_t num_declared_functions
CanonicalTypeIndex canonical_sig_id(ModuleTypeIndex index) const
uint32_t num_imported_functions
size_t EstimateCurrentMemoryConsumption() const
std::vector< WasmCompilationHint > compilation_hints
std::vector< std::pair< uint32_t, uint32_t > > inst_traces
std::vector< WasmTag > tags
std::vector< WasmGlobal > globals
TypeFeedbackStorage type_feedback
BranchHintInfo branch_hints
std::vector< WasmDataSegment > data_segments
WasmModule(ModuleOrigin=kWasmOrigin)
std::vector< WasmTable > tables
size_t EstimateStoredSize() const