5#ifndef V8_WASM_WASM_OBJECTS_INL_H_
6#define V8_WASM_WASM_OBJECTS_INL_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
32#include "third_party/fp16/src/include/fp16.h"
34#if V8_ENABLE_DRUMBRAKE
43#include "torque-generated/src/wasm/wasm-objects-tq-inl.inc"
70#define OPTIONAL_ACCESSORS(holder, name, type, offset) \
71 DEF_GETTER(holder, has_##name, bool) { \
72 Tagged<Object> value = \
73 TaggedField<Object, offset>::load(cage_base, *this); \
74 return !IsUndefined(value); \
76 ACCESSORS_CHECKED2(holder, name, type, offset, !IsUndefined(value), true)
78#define PRIMITIVE_ACCESSORS(holder, name, type, offset) \
79 type holder::name() const { \
80 return ReadMaybeUnalignedValue<type>(FIELD_ADDR(*this, offset)); \
82 void holder::set_##name(type value) { \
83 WriteMaybeUnalignedValue<type>(FIELD_ADDR(*this, offset), value); \
88 return managed_native_module()->raw();
90const std::shared_ptr<wasm::NativeModule>&
92 return managed_native_module()->get();
99 bool asm_js = is_asmjs_module(
module());
109 kUntaggedBufferOffset)
114 kWasmTrustedInstanceDataIndirectPointerTag)
127void WasmGlobalObject::set_type(wasm::ValueType value) {
128 set_raw_type(
static_cast<int>(value.raw_bit_field()));
136 return reinterpret_cast<Address>(untagged_buffer()->backing_store()) +
157 return reinterpret_cast<uint8_t*
>(
address());
196 kProtectedManagedNativeModuleOffset)
198 Address*, kNewAllocationLimitAddressOffset)
200 Address*, kNewAllocationTopAddressOffset)
202 Address*, kOldAllocationLimitAddressOffset)
204 Address*, kOldAllocationTopAddressOffset)
209#if V8_ENABLE_DRUMBRAKE
214 kJumpTableStartOffset)
216 Address, kHookOnFunctionCallAddressOffset)
218 std::atomic<uint32_t>*, kTieringBudgetArrayOffset)
221 kProtectedMemoryBasesAndSizesOffset)
225 kDataSegmentSizesOffset)
227 kElementSegmentsOffset)
234 kNativeContextOffset)
236 kMemoryObjectsOffset)
245#if V8_ENABLE_DRUMBRAKE
247 kInterpreterObjectOffset)
257 kProtectedDispatchTableForImportsOffset)
263 kManagedObjectMapsOffset)
265 kFeedbackVectorsOffset)
267 kWellKnownImportsOffset)
269 Address, kStressDeoptCounterOffset)
272 constexpr int kPaddingBytes =
FIELD_SIZE(kOptionalPaddingOffset);
273 static_assert(kPaddingBytes == 0 || kPaddingBytes ==
kIntSize);
274 if constexpr (kPaddingBytes != 0) {
275 WriteField<int>(kOptionalPaddingOffset, 0);
280 int memory_index)
const {
286 reinterpret_cast<uint8_t*
>(memory_bases_and_sizes()->get(0)));
287 return reinterpret_cast<uint8_t*
>(
288 memory_bases_and_sizes()->get(2 * memory_index));
293 return memory_bases_and_sizes()->get(2 * memory_index + 1);
297 uint32_t table_index) {
299 DCHECK(IsWasmDispatchTable(table));
305 DCHECK(maybe_table ==
Smi::zero() || IsWasmDispatchTable(maybe_table));
310 return managed_native_module()->get().get();
324 kWasmTrustedInstanceDataIndirectPointerTag)
330 return module_object()->module();
334 DirectHandle<WasmTrustedInstanceData>
instance_data,
int index)
345 kProtectedOffheapDataOffset)
347 return protected_offheap_data()->get().get();
351 ProtectedWeakFixedArray, kProtectedUsesOffset)
353wasm::CanonicalValueType WasmDispatchTable::table_type()
const {
354 return wasm::CanonicalValueType::FromRawBitField(
355 ReadField<uint32_t>(kTableTypeOffset));
357void WasmDispatchTable::set_table_type(wasm::CanonicalValueType type) {
358 DCHECK(type.IsFunctionType());
359 WriteField(kTableTypeOffset, type.raw_bit_field());
362void WasmDispatchTable::clear_entry_padding(
int index) {
363 static_assert(kEntryPaddingBytes == 0 || kEntryPaddingBytes ==
kIntSize);
364 if constexpr (kEntryPaddingBytes != 0) {
365 WriteField<int>(OffsetOf(index) + kEntryPaddingOffset, 0);
373int WasmDispatchTable::length()
const {
return ReadField<int>(kLengthOffset); }
375int WasmDispatchTable::capacity()
const {
376 return ReadField<int>(kCapacityOffset);
382 ReadProtectedPointerField(OffsetOf(index) + kImplicitArgBias);
383 DCHECK(IsWasmTrustedInstanceData(implicit_arg) ||
384 IsWasmImportData(implicit_arg) || implicit_arg == Smi::zero());
390 if (
v8_flags.wasm_jitless)
return wasm::kInvalidWasmCodePointer;
391 return WasmCodePointer{ReadField<uint32_t>(OffsetOf(index) + kTargetBias)};
397 ReadField<uint32_t>(OffsetOf(index) + kSigBias)};
400#if V8_ENABLE_DRUMBRAKE
401inline uint32_t WasmDispatchTable::function_index(
int index)
const {
403 if (!
v8_flags.wasm_jitless)
return UINT_MAX;
404 return ReadField<uint32_t>(OffsetOf(index) + kFunctionIndexBias);
412WasmExportedFunction::WasmExportedFunction(Address ptr) : JSFunction(ptr) {
430 kProtectedInstanceDataOffset)
433 kProtectedCallOriginOffset)
436 return SuspendField::decode(
bit_field());
443uint32_t WasmImportData::table_slot()
const {
447void WasmImportData::set_table_slot(uint32_t value) {
455 kProtectedImplicitArgOffset)
460 kWasmInternalFunctionIndirectPointerTag)
466 kProtectedInternalOffset)
471 kProtectedInstanceDataOffset)
481 static_cast<uint32_t
>(canonical_type_index())};
493 set_raw_call_target(code_pointer.
value());
502 kProtectedOffheapDataOffset)
505 return protected_offheap_data()->get().get();
509WasmJSFunction::WasmJSFunction(
Address ptr) : JSFunction(ptr) {
516 return WasmJSFunction::IsWasmJSFunction(value);
519 return WasmJSFunction::IsWasmJSFunction(value);
529WasmCapiFunction::WasmCapiFunction(Address ptr) :
JSFunction(ptr) {
544WasmExternalFunction::WasmExternalFunction(
Address ptr) : JSFunction(ptr) {
559 return shared()->wasm_function_data()->func_ref();
575#undef OPTIONAL_ACCESSORS
576#undef READ_PRIMITIVE_FIELD
577#undef WRITE_PRIMITIVE_FIELD
578#undef PRIMITIVE_ACCESSORS
582 kWasmTrustedInstanceDataIndirectPointerTag)
586 kWasmDispatchTableIndirectPointerTag)
590 SBXCHECK(!type.has_index() || module->has_type(type.ref_index()));
599 return module->canonical_type(unsafe);
615 return entry_index < static_cast<uint32_t>(current_length());
624 if (IsUndefined(max))
return std::nullopt;
629 uint64_t value =
Cast<BigInt>(maximum_length())->AsUint64(&lossless);
639 DCHECK_GE(std::numeric_limits<uint64_t>::max(), value);
655 switch (type.kind()) {
666 return isolate->factory()->NewNumberFromInt(value);
674 return isolate->factory()->NewNumber(fp16_ieee_to_fp32_value(value));
678 return isolate->factory()->NewNumber(value);
682 return isolate->factory()->NewNumber(value);
689 case wasm::kRefNull: {
703template <
typename ElementType>
708 return static_cast<ElementType
>(
Smi::ToInt(value));
710 }
else if (IsHeapNumber(value)) {
712 if (std::is_same<ElementType, double>::value ||
713 std::is_same<ElementType, float>::value) {
714 return static_cast<ElementType
>(double_value);
716 CHECK(std::is_integral<ElementType>::value);
717 return static_cast<ElementType
>(
DoubleToInt32(double_value));
748 int offset = WasmStruct::kHeaderSize + raw_offset;
765 DCHECK_EQ(WASM_ARRAY_TYPE, map->instance_type());
767 return type_info->type().ref_index();
771 DCHECK_EQ(WASM_ARRAY_TYPE, map->instance_type());
777 return type_info->element_type();
788 return WasmArray::kHeaderSize + index * element_size;
797 DCHECK(
map()->wasm_type_info()->element_type().is_reference());
798 return RawField(kHeaderSize +
kTaggedSize * index);
805 if (index >= array->length()) {
806 return isolate->factory()->undefined_value();
809 array->map()->wasm_type_info()->element_type();
810 return ReadValueAt(isolate, array, element_type,
811 array->element_offset(index));
816 map->SetWasmByte1(element_size);
821 return map->WasmByte1();
829 kWasmTrustedInstanceDataIndirectPointerTag)
831#include "src/objects/object-macros-undef.h"
#define SBXCHECK(condition)
#define SLOW_DCHECK(condition)
static constexpr T decode(U value)
static V8_NODISCARD constexpr U update(U previous, T value)
static V8_EXPORT_PRIVATE Handle< BigInt > FromInt64(Isolate *isolate, int64_t n)
Tagged< Object > load() const
ImportedFunctionEntry(DirectHandle< WasmTrustedInstanceData >, int index)
static V8_INLINE Isolate * Current()
static double NumberValue(Tagged< Number > obj)
static constexpr int ToInt(const Tagged< Object > object)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr Tagged< Smi > zero()
static PtrType load(Tagged< HeapObject > host, int offset=0)
static void store(Tagged< HeapObject > host, PtrType value)
V8_EXPORT_PRIVATE wasm::WasmValue GetElement(uint32_t index)
static int SizeFor(Tagged< Map > map, int length)
uint32_t element_offset(uint32_t index)
static const wasm::CanonicalValueType GcSafeElementType(Tagged< Map > map)
static int DecodeElementSizeFromMap(Tagged< Map > map)
static wasm::CanonicalTypeIndex type_index(Tagged< Map > map)
static void EncodeElementSizeInMap(int element_size, Tagged< Map > map)
Address ElementAddress(uint32_t index)
ObjectSlot ElementSlot(uint32_t index)
static bool IsWasmCapiFunction(Tagged< Object > object)
bool is_promising() const
static V8_EXPORT_PRIVATE bool IsWasmExportedFunction(Tagged< Object > object)
static bool IsWasmExternalFunction(Tagged< Object > object)
Tagged< WasmFuncRef > func_ref() const
void SetF64(double value)
uint8_t * GetS128RawBytes()
void SetI64(int64_t value)
DirectHandle< Object > GetRef()
void SetI32(int32_t value)
void SetRef(DirectHandle< Object > value)
const wasm::WasmModule * module() const
V8_INLINE void set_call_target(WasmCodePointer code_pointer)
V8_INLINE WasmCodePointer call_target()
wasm::CanonicalTypeIndex sig_index() const
const wasm::WasmModule * module() const
wasm::NativeModule * native_module() const
const std::shared_ptr< wasm::NativeModule > & shared_native_module() const
static DirectHandle< Object > ReadValueAt(Isolate *isolate, DirectHandle< HeapObject > obj, wasm::CanonicalValueType type, uint32_t offset)
static ElementType FromNumber(Tagged< Object > value)
Address RawFieldAddress(int raw_offset)
static int DecodeInstanceSizeFromMap(Tagged< Map > map)
static void EncodeInstanceSizeInMap(int instance_size, Tagged< Map > map)
Tagged< Map > get_described_rtt() const
ObjectSlot RawField(int raw_offset)
void set_described_rtt(Tagged< Map > rtt)
static int GcSafeSize(Tagged< Map > map)
bool is_in_bounds(uint32_t entry_index)
wasm::CanonicalValueType canonical_type(const wasm::WasmModule *module)
wasm::ValueType unsafe_type()
std::optional< uint64_t > maximum_length_u64() const
wasm::NativeModule * native_module() const
Tagged< WasmModuleObject > module_object() const
size_t memory_size(int memory_index) const
uint8_t * memory_base(int memory_index) const
Tagged< WasmDispatchTable > dispatch_table(uint32_t table_index)
const wasm::WasmModule * module() const
Tagged< WasmMemoryObject > memory_object(int memory_index) const
bool has_dispatch_table(uint32_t table_index)
wasm::CanonicalValueType type() const
wasm::CanonicalTypeIndex type_index() const
wasm::CanonicalValueType element_type() const
static constexpr CanonicalValueType FromRawBitField(uint32_t bits)
constexpr CanonicalTypeIndex ref_index() const
const WasmModule * module() const
constexpr bool has_index() const
static constexpr ValueType FromRawBitField(uint32_t bits)
constexpr ModuleTypeIndex ref_index() const
SharedFunctionInfoRef shared
static V ReadUnalignedValue(Address p)
static void WriteUnalignedValue(Address p, V value)
constexpr int kMaxValueTypeSize
constexpr size_t kV8MaxWasmStructFields
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset kFuncRefsOffset feedback_vectors
constexpr int kTaggedSize
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset kFuncRefsOffset kFeedbackVectorsOffset stress_deopt_counter_address
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset dispatch_table_for_imports
SlotTraits::TObjectSlot ObjectSlot
kMemory0SizeOffset new_allocation_limit_address
bool IsNumber(Tagged< Object > obj)
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset tiering_budget_array
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset old_allocation_limit_address
kWasmInternalFunctionIndirectPointerTag instance_data
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset globals_start
Handle< To > UncheckedCast(Handle< From > value)
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset memory_objects
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset jump_table_start
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset tables
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset data_segment_starts
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset func_refs
int32_t DoubleToInt32(double x)
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset element_segments
kTrustedDispatchTableOffset
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset tagged_globals_buffer
V8_EXPORT_PRIVATE FlagValues v8_flags
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset dispatch_table0
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset instance_object
constexpr int kObjectAlignmentBits
kInterpreterTrampolineOffset script
!IsContextMap !IsContextMap native_context
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define FIELD_ADDR(p, offset)
#define CODE_POINTER_ACCESSORS(holder, name, offset)
#define PROTECTED_POINTER_ACCESSORS(holder, name, type, offset)
#define EXTERNAL_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define ACQUIRE_READ_INT32_FIELD(p, offset)
#define ACCESSORS(holder, name, type, offset)
#define TRUSTED_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define DCHECK_LE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
bool has_type(ModuleTypeIndex index) const
#define PRIMITIVE_ACCESSORS(holder, name, type, offset)
#define OPTIONAL_ACCESSORS(holder, name, type, offset)