5#ifndef V8_WASM_VALUE_TYPE_H_
6#define V8_WASM_VALUE_TYPE_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
31#define FOREACH_NUMERIC_VALUE_TYPE(V) \
32 V(I32, 2, I32, Int32, 'i', "i32") \
33 V(I64, 3, I64, Int64, 'l', "i64") \
34 V(F32, 2, F32, Float32, 'f', "f32") \
35 V(F64, 3, F64, Float64, 'd', "f64") \
36 V(S128, 4, S128, Simd128, 's', "v128") \
37 V(I8, 0, I8, Int8, 'b', "i8") \
38 V(I16, 1, I16, Int16, 'h', "i16") \
39 V(F16, 1, F16, Float16, 'p', "f16")
41#define FOREACH_VALUE_TYPE(V) \
42 V(Void, -1, Void, None, 'v', "<void>") \
43 FOREACH_NUMERIC_VALUE_TYPE(V) \
44 V(Ref, kTaggedSizeLog2, Ref, AnyTagged, 'r', "ref") \
45 V(RefNull, kTaggedSizeLog2, RefNull, AnyTagged, 'n', "ref null") \
46 V(Top, -1, Void, None, '\\', "<top>") \
47 V(Bottom, -1, Void, None, '*', "<bot>")
81 return index == other.index;
94 return oss << index.index;
104#define DEF_ENUM(kind, ...) k##kind,
147namespace value_type_impl {
156#define FUNC value_type_impl::RefTypeKindField::encode(RefTypeKind::kFunction)
157#define STRUCT value_type_impl::RefTypeKindField::encode(RefTypeKind::kStruct)
158#define ARRAY value_type_impl::RefTypeKindField::encode(RefTypeKind::kArray)
159#define CONT value_type_impl::RefTypeKindField::encode(RefTypeKind::kCont)
160#define REF value_type_impl::IsRefField::encode(true)
161#define SENTINEL value_type_impl::HasIndexOrSentinelField::encode(true)
162#define EXACT value_type_impl::IsExactField::encode(Exactness::kExact)
168#define FOREACH_NONE_TYPE(V) \
169 V(NoCont, NoCont, REF | CONT | EXACT, "nocont") \
170 V(NoExn, NoExn, REF | EXACT, "noexn") \
171 V(NoExtern, NoExtern, REF | EXACT, "noextern") \
172 V(NoFunc, NoFunc, REF | FUNC | EXACT, "nofunc") \
173 V(None, None, REF | EXACT, "none")
175#define FOREACH_ABSTRACT_TYPE(V) \
176 FOREACH_NONE_TYPE(V) \
178 V(Func, FuncRef, REF | FUNC, "func") \
179 V(Any, AnyRef, REF, "any") \
180 V(Eq, EqRef, REF, "eq") \
181 V(I31, I31Ref, REF, "i31") \
182 V(Struct, StructRef, REF | STRUCT, "struct") \
183 V(Array, ArrayRef, REF | ARRAY, "array") \
184 V(Extern, ExternRef, REF, "extern") \
185 V(Exn, ExnRef, REF, "exn") \
187 V(Cont, ContRef, REF | CONT, "cont") \
189 V(String, StringRef, REF, "string") \
190 V(StringViewWtf8, StringViewWtf8, REF, "stringview_wtf8") \
191 V(StringViewWtf16, StringViewWtf16, REF, "stringview_wtf16") \
192 V(StringViewIter, StringViewIter, REF, "stringview_iter")
195#define FOREACH_INTERNAL_TYPE(V) \
196 V(Void, Void, SENTINEL, "<void>") \
197 V(Top, Void, SENTINEL, "<top>") \
198 V(Bottom, Void, SENTINEL | EXACT, "<bot>") \
199 V(ExternString, Void, REF, "<extern_string>")
201#define FOREACH_GENERIC_TYPE(V) \
202 FOREACH_INTERNAL_TYPE(V) \
203 FOREACH_ABSTRACT_TYPE(V)
222namespace value_type_impl {
267#define DEF_ENUM(kind, ...) k##kind,
277#define DEF_ENUM(kind, code, extra_bits, ...) \
278 k##kind = value_type_impl::PayloadField::encode( \
279 static_cast<uint8_t>(StandardType::k##kind)) + \
286#define DEF_ENUM(kind, ...) \
287 k##kind = value_type_impl::PayloadField::encode( \
288 static_cast<uint8_t>(StandardType::k##kind)) + \
289 value_type_impl::kNumericExtraBits,
302namespace value_type_impl {
307 static_assert(
static_cast<uint32_t
>(StandardType::kI32) >=
323#define NULLTYPE(name, ...) \
324 case GenericKind::k##name: \
428 return bits ==
static_cast<uint32_t
>(GenericKind::kBottom);
432 return bits ==
static_cast<uint32_t
>(GenericKind::kTop);
436 return bits ==
static_cast<uint32_t
>(GenericKind::kVoid);
440 return bits ==
static_cast<uint32_t
>(GenericKind::kStringViewWtf8) ||
441 bits ==
static_cast<uint32_t
>(GenericKind::kStringViewWtf16) ||
442 bits ==
static_cast<uint32_t
>(GenericKind::kStringViewIter);
445 return bit_field_ ==
static_cast<uint32_t
>(NumericKind::kI8) ||
446 bit_field_ ==
static_cast<uint32_t
>(NumericKind::kI16) ||
447 bit_field_ ==
static_cast<uint32_t
>(NumericKind::kF16);
467 if (ref == GenericKind::kExtern)
return false;
468 if (ref == GenericKind::kExternString)
return false;
469 if (ref == GenericKind::kNoExtern)
return false;
476 constexpr uint8_t kValueKindSizeLog2[] = {
477#define VALUE_KIND_SIZE_LOG2(kind, log2Size, ...) log2Size,
479#undef VALUE_KIND_SIZE_LOG2
482 return kValueKindSizeLog2[
index];
488 constexpr uint8_t kValueKindSize[] = {
489#define ELEM_SIZE_LOG2(kind, log2Size, ...) (1 << log2Size),
494 return kValueKindSize[
index];
511#define MACH_TYPE(kind, log2Size, code, machineType, ...) \
512 MachineType::machineType(),
517 return kMachineType[
index];
561 constexpr const char kNumericShortName[] = {
562#define SHORT_NAME(kind, log2, code, mtype, shortName, ...) shortName,
567 return kNumericShortName[
index];
574 static_assert(
static_cast<int>(StandardType::kI32) >
575 static_cast<int>(StandardType::kAny));
634 case NumericKind::kI32:
636 case NumericKind::kI64:
638 case NumericKind::kF32:
640 case NumericKind::kF64:
642 case NumericKind::kS128:
644 case NumericKind::kI8:
646 case NumericKind::kI16:
648 case NumericKind::kF16:
653 if (
is_top())
return kTop;
679 value_type_impl::IsNullableField::encode(nullable) |
680 value_type_impl::IsSharedField::encode(
is_shared)) {
689 value_type_impl::IsNullableField::encode(nullable) |
690 value_type_impl::IsExactField::encode(exact) |
691 value_type_impl::IsSharedField::encode(shared) |
693 value_type_impl::PayloadField::encode(index.index)) {
723 DCHECK(!type.is_numeric());
731 return Generic(GenericKind::kBottom,
false);
733 constexpr size_t kNumCases =
kLast - kFirst + 1;
734 constexpr std::array<GenericKind, kNumCases> kLookupTable =
737#define CASE(name, code, ...) \
738 case (k##code##Code - kFirst): \
739 static_assert(k##code##Code >= kFirst && k##code##Code <= kLast); \
740 return GenericKind::k##name;
744 return GenericKind::kBottom;
767 constexpr uint32_t kMask = ~value_type_impl::IsRefField::kMask &
768 ~value_type_impl::IsNullableField::kMask;
769 return (
bit_field_ & kMask) == (other.bit_field_ & kMask);
776 return std::to_string(
raw_index().index);
851 bool distinguish_shared)
const {
855 case GenericKind::kTop:
857 case GenericKind::kBottom:
860#define CASE(name, ...) \
861 case GenericKind::k##name: \
862 return distinguish_shared && is_shared() ? HeapType::k##name##Shared \
867 case GenericKind::kExternString:
870 case GenericKind::kVoid:
939 if (!
is_ref())
return *
this;
945 if (
bit_field_ ==
static_cast<uint32_t
>(NumericKind::kI8) ||
946 bit_field_ ==
static_cast<uint32_t
>(NumericKind::kI16)) {
949 if (
bit_field_ ==
static_cast<uint32_t
>(NumericKind::kF16)) {
977 switch (type.representation()) {
1034 type.raw_bit_field(), nullable))};
1124 bool shared =
false)
1147 constexpr int8_t kValueKindSizeLog2[] = {
1148#define VALUE_KIND_SIZE_LOG2(kind, log2Size, ...) log2Size,
1150#undef VALUE_KIND_SIZE_LOG2
1153 int size_log_2 = kValueKindSizeLog2[
kind];
1159 constexpr int8_t kElementSize[] = {
1160#define ELEM_SIZE_LOG2(kind, log2Size, ...) \
1161 log2Size == -1 ? -1 : (1 << std::max(0, log2Size)),
1163#undef ELEM_SIZE_LOG2
1166 int size = kElementSize[
kind];
1180 constexpr const char* kKindName[] = {
1181#define KIND_NAME(kind, log2Size, code, machineType, shortName, kindName, ...) \
1187 return kKindName[
kind];
1199#define MACH_TYPE(kind, log2Size, code, machineType, ...) \
1200 MachineType::machineType(),
1205 return kMachineType[
kind];
1215static_assert(
sizeof(ValueTypeBase) <=
kUInt32Size,
1216 "ValueType is small and can be passed by value");
1218 "ValueType has space to be encoded in a Smi");
1222 return oss << type.name() <<
" (raw=0x" << std::hex << type.raw_bit_field()
1255 GenericKind::kExternString};
1271#define FOREACH_WASMVALUE_CTYPES(V) \
1305#define FOREACH_LOAD_TYPE(V) \
1309 V(I32, 16S, Int16) \
1310 V(I32, 16U, Uint16) \
1314 V(I64, 16S, Int16) \
1315 V(I64, 16U, Uint16) \
1316 V(I64, 32S, Int32) \
1317 V(I64, 32U, Uint32) \
1318 V(F32, F16, Float16) \
1326#define DEF_ENUM(type, suffix, ...) k##type##Load##suffix,
1354 return is_signed ? kI32Load8S : kI32Load8U;
1356 return is_signed ? kI32Load16S : kI32Load16U;
1369#define LOAD_SIZE(_, __, memtype) \
1370 static_cast<uint8_t>( \
1371 ElementSizeInBytes(MachineType::memtype().representation())),
1378#define LOAD_SIZE(_, __, memtype) \
1379 static_cast<uint8_t>( \
1380 ElementSizeLog2Of(MachineType::memtype().representation())),
1386#define VALUE_TYPE(type, ...) ValueType::Primitive(k##type),
1392#define MEMTYPE(_, __, memtype) MachineType::memtype(),
1398#define FOREACH_STORE_TYPE(V) \
1401 V(I32, 16, Word16) \
1404 V(I64, 16, Word16) \
1405 V(I64, 32, Word32) \
1406 V(F32, F16, Float16) \
1414#define DEF_ENUM(type, suffix, ...) k##type##Store##suffix,
1446 return kF32StoreF16;
1457#define STORE_SIZE(_, __, memrep) \
1458 static_cast<uint8_t>(ElementSizeLog2Of(MachineRepresentation::k##memrep)),
1464#define VALUE_TYPE(type, ...) ValueType::Primitive(k##type),
1470#define MEMREP(_, __, memrep) MachineRepresentation::k##memrep,
1477 const CanonicalSig* wasm_signature);
static constexpr int kLastUsedBit
static constexpr T decode(U value)
static constexpr bool is_valid(T value)
static constexpr U encode(T value)
static V8_NODISCARD constexpr U update(U previous, T value)
static constexpr int kSize
static constexpr int kShift
constexpr MachineRepresentation representation() const
static constexpr MachineType AnyTagged()
static constexpr MachineType None()
size_t return_count() const
size_t parameter_count() const
CanonicalSig * Get() const
Builder(Zone *zone, size_t return_count, size_t parameter_count)
uint64_t signature_hash() const
CanonicalSig(size_t return_count, size_t parameter_count, const CanonicalValueType *reps)
CanonicalValueType AsExactIfProposalEnabled(Exactness exact=Exactness::kExact) const
constexpr CanonicalValueType AsExact(Exactness exact=Exactness::kExact) const
static constexpr CanonicalValueType RefNull(CanonicalTypeIndex index, bool shared, RefTypeKind kind)
constexpr HeapType::Representation heap_representation() const
static constexpr CanonicalValueType FromRawBitField(uint32_t bits)
static constexpr CanonicalValueType Ref(CanonicalTypeIndex index, bool shared, RefTypeKind kind)
constexpr HeapType::Representation heap_representation_non_shared() const
constexpr CanonicalTypeIndex ref_index() const
constexpr bool is_reference_to(HeapType::Representation repr) const
static constexpr CanonicalValueType Primitive(NumericKind kind)
constexpr bool IsFunctionType() const
static constexpr CanonicalValueType RefMaybeNull(CanonicalValueType type, Nullability nullable)
constexpr bool operator==(CanonicalValueType other) const
static constexpr HeapType Generic(GenericKind kind, bool shared)
static constexpr HeapType from_code(uint8_t code, bool is_shared)
constexpr bool operator==(HeapType other) const
constexpr HeapType AsExact(Exactness exact=Exactness::kExact) const
static constexpr HeapType Index(ModuleTypeIndex index, bool shared, RefTypeKind kind, Exactness exact=Exactness::kAnySubtype)
constexpr Representation representation() const
constexpr bool is_non_nullable() const
constexpr bool is_index() const
constexpr bool is_nullable() const
constexpr ModuleTypeIndex ref_index() const
static constexpr HeapType FromBits(uint32_t bits)
constexpr Nullability nullability() const
constexpr HeapType heap_type() const
constexpr IndependentHeapType AsNonNull() const
constexpr IndependentHeapType(GenericKind kind, Nullability nullable=kNullable, bool shared=false)
constexpr bool operator==(CanonicalValueType b) const
constexpr IndependentValueType(NumericKind kind)
constexpr bool operator==(ValueType b) const
constexpr IndependentValueType(GenericKind kind, Nullability nullable, bool shared)
constexpr ValueType value_type() const
constexpr LoadType(LoadTypeValue val)
constexpr uint8_t size() const
static LoadType ForValueKind(ValueKind kind, bool is_signed=false)
constexpr uint8_t size_log_2() const
static constexpr ValueType kValueType[]
constexpr MachineType mem_type() const
static constexpr MachineType kMemType[]
static constexpr uint8_t kLoadSize[]
static constexpr uint8_t kLoadSizeLog2[]
constexpr LoadTypeValue value() const
static constexpr ValueType kValueType[]
static StoreType ForValueKind(ValueKind kind)
constexpr MachineRepresentation mem_rep() const
static constexpr uint8_t kStoreSizeLog2[]
constexpr StoreTypeValue value() const
static constexpr MachineRepresentation kMemRep[]
constexpr unsigned size_log_2() const
constexpr ValueType value_type() const
constexpr StoreType(StoreTypeValue val)
constexpr unsigned size() const
V8_EXPORT_PRIVATE ValueTypeCode value_type_code_numeric() const
constexpr bool is_ref() const
V8_EXPORT_PRIVATE std::string generic_heaptype_name() const
static const uint32_t kIndexShift
constexpr int value_kind_size() const
constexpr int value_kind_size_log2() const
size_t hash_value() const
V8_EXPORT_PRIVATE ValueTypeCode value_type_code_generic() const
constexpr char short_name() const
constexpr bool is_non_nullable() const
friend class CanonicalValueType
constexpr TypeIndex raw_index() const
constexpr bool is_sentinel() const
constexpr NumericKind numeric_kind() const
static const uint32_t kIsNullableBit
static const uint32_t kRefKindShift
static const int kLastUsedBit
constexpr bool is_valid() const
constexpr StandardType standard_type() const
void Populate(bool shared, RefTypeKind kind)
constexpr bool encoding_needs_shared() const
constexpr MachineType machine_type() const
constexpr bool is_bottom() const
constexpr bool is_packed() const
constexpr bool is_reference_to(GenericKind type) const
constexpr ValueTypeBase(GenericKind kind, Nullability nullable, bool is_shared)
constexpr uint32_t raw_heap_representation(bool distinguish_shared) const
constexpr ValueTypeBase(NumericKind kind)
constexpr ValueKind kind() const
constexpr bool is_reference() const
static const uint32_t kHasIndexBit
constexpr bool is_shared() const
constexpr MachineRepresentation machine_representation() const
constexpr bool is_string_view() const
static const uint32_t kRefKindBits
constexpr bool encoding_needs_exact() const
constexpr bool has_index() const
constexpr Nullability nullability() const
constexpr Exactness exactness() const
constexpr bool is_generic() const
constexpr bool is_object_reference() const
constexpr bool is_numeric() const
constexpr bool is_void() const
constexpr bool is_nullable() const
constexpr bool is_uninhabited() const
static const int kNumIndexBits
constexpr ValueTypeBase(TypeIndex index, Nullability nullable, Exactness exact, bool shared, RefTypeKind ref_type_kind)
constexpr ValueTypeBase()
static const uint32_t kIsRefBit
constexpr bool encoding_needs_heap_type() const
constexpr bool is_exact() const
constexpr bool is_abstract_ref() const
constexpr bool is_defaultable() const
V8_EXPORT_PRIVATE std::string name() const
constexpr uint32_t raw_bit_field() const
constexpr TypeKind type_kind() const
constexpr bool is_top() const
constexpr bool use_wasm_null() const
constexpr RefTypeKind ref_type_kind() const
constexpr ValueTypeBase(uint32_t bit_field)
constexpr int value_kind_full_size() const
static const uint32_t kIndexBits
constexpr GenericKind generic_kind() const
ValueTypeCode value_type_code() const
static constexpr ValueTypeBase Primitive(ValueKind kind)
constexpr ValueType AsNonShared() const
static constexpr ValueType FromRawBitField(uint32_t bits)
static constexpr ValueType Primitive(ValueKind kind)
static constexpr ValueType Generic(GenericKind kind, Nullability nullable, bool shared)
constexpr ValueType AsExact(Exactness exact=Exactness::kExact) const
constexpr HeapType heap_type() const
constexpr bool operator==(ValueType other) const
static constexpr ValueType RefNull(ModuleTypeIndex index, bool shared, RefTypeKind kind)
constexpr bool is_reference_to(HeapType::Representation repr) const
static ValueType For(MachineType type)
ValueType AsExactIfProposalEnabled(Exactness exact=Exactness::kExact) const
constexpr HeapType::Representation heap_representation() const
static constexpr ValueType Ref(HeapType type)
constexpr bool is_reference_to(GenericKind kind) const
static constexpr ValueType RefMaybeNull(HeapType type, Nullability nullable)
constexpr CanonicalValueType Canonicalize(CanonicalTypeIndex index) const
constexpr ValueType Unpacked() const
static constexpr ValueType Ref(ModuleTypeIndex index, bool shared, RefTypeKind kind)
constexpr ModuleTypeIndex ref_index() const
static constexpr ValueType RefNull(HeapType type)
static constexpr ValueType RefMaybeNull(ModuleTypeIndex index, Nullability nullable, bool shared, RefTypeKind kind)
static constexpr ValueType Primitive(NumericKind kind)
constexpr ValueType AsNonNull() const
constexpr ValueType AsNullable(Nullability nullable=kNullable) const
constexpr auto make_array(Function f)
UnionOf< BigInt, NonBigIntPrimitive > Primitive
WordWithBits< 128 > Simd128
static constexpr uint32_t kNumericExtraBits
static constexpr uint32_t kNumberOfNumericKinds
static constexpr uint32_t kGenericKindMask
static constexpr uint32_t kNumericKindMask
constexpr uint32_t ToZeroBasedIndex(NumericKind kind)
static constexpr uint32_t kNumberOfStandardTypes
static constexpr uint32_t kNumberOfGenericKinds
constexpr bool IsNullKind(GenericKind kind)
constexpr MachineType machine_type(ValueKind kind)
bool EquivalentNumericSig(const CanonicalSig *a, const FunctionSig *b)
constexpr IndependentHeapType kWasmNullExternRef
constexpr IndependentHeapType kWasmNullRef
constexpr IndependentHeapType kWasmRefExtern
constexpr IndependentHeapType kWasmRefNullExternString
constexpr IndependentHeapType kWasmStringRef
std::optional< wasm::ValueKind > WasmReturnTypeFromSignature(const CanonicalSig *wasm_signature)
constexpr IndependentValueType kWasmI8
constexpr IndependentValueType kWasmF32
constexpr IndependentHeapType kWasmAnyRef
constexpr IndependentHeapType kWasmStringViewWtf8
constexpr IndependentHeapType kWasmEqRef
constexpr IndependentHeapType kWasmExternRef
constexpr int value_kind_full_size(ValueKind kind)
constexpr IndependentHeapType kWasmNullFuncRef
constexpr IndependentValueType kWasmI32
constexpr bool is_packed(ValueKind kind)
constexpr IndependentHeapType kWasmStringViewIter
constexpr IndependentHeapType kWasmContRef
constexpr IndependentHeapType kWasmI31Ref
constexpr IndependentValueType kWasmF16
constexpr IndependentHeapType kWasmFuncRef
constexpr int value_kind_size_log2(ValueKind kind)
const wasm::FunctionSig * GetI32Sig(Zone *zone, const wasm::FunctionSig *sig)
constexpr size_t kV8MaxWasmTypes
constexpr IndependentHeapType kWasmTop
constexpr bool is_object_reference(ValueKind kind)
constexpr IndependentHeapType kWasmRefI31
constexpr ValueKind unpacked(ValueKind kind)
constexpr IndependentHeapType kWasmExnRef
constexpr IndependentHeapType kWasmRefExternString
static constexpr bool kNotShared
constexpr IndependentHeapType kWasmStringViewWtf16
constexpr IndependentHeapType kWasmVoid
constexpr IndependentHeapType kWasmStructRef
constexpr IndependentHeapType kWasmNullContRef
constexpr int value_kind_size(ValueKind kind)
constexpr IndependentHeapType kWasmBottom
std::ostream & operator<<(std::ostream &os, LiftoffVarState slot)
constexpr IndependentValueType kWasmS128
constexpr int kMaxValueTypeSize
constexpr IndependentValueType kWasmF64
constexpr bool is_reference(ValueKind kind)
constexpr IndependentValueType kWasmI64
constexpr IndependentValueType kWasmI16
constexpr IndependentHeapType kWasmRefString
constexpr IndependentHeapType kWasmArrayRef
constexpr IndependentHeapType kWasmNullExnRef
constexpr int kTaggedSize
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
constexpr int kSystemPointerSize
constexpr int kTaggedSizeLog2
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kUInt32Size
bool is_signed(Condition cond)
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define ASSERT_TRIVIALLY_COPYABLE(T)
#define V8_EXPORT_PRIVATE
auto operator<=>(CanonicalTypeIndex other) const
bool operator==(CanonicalTypeIndex other) const
static constexpr CanonicalTypeIndex Invalid()
static constexpr ModuleTypeIndex Invalid()
auto operator<=>(ModuleTypeIndex other) const
bool operator==(ModuleTypeIndex other) const
static constexpr uint32_t kInvalid
constexpr bool valid() const
size_t hash_value() const
#define V8_LIKELY(condition)
#define FOREACH_STORE_TYPE(V)
#define NULLTYPE(name,...)
#define LOAD_SIZE(_, __, memtype)
#define ELEM_SIZE_LOG2(kind, log2Size,...)
#define MEMTYPE(_, __, memtype)
#define FOREACH_NUMERIC_VALUE_TYPE(V)
#define FOREACH_ABSTRACT_TYPE(V)
#define MEMREP(_, __, memrep)
#define VALUE_KIND_SIZE_LOG2(kind, log2Size,...)
#define SHORT_NAME(kind, log2, code, mtype, shortName,...)
#define KIND_NAME(kind, log2Size, code, machineType, shortName, kindName,...)
#define VALUE_TYPE(type,...)
#define FOREACH_NONE_TYPE(V)
#define FOREACH_LOAD_TYPE(V)
#define MACH_TYPE(kind, log2Size, code, machineType,...)
#define FOREACH_VALUE_TYPE(V)
#define STORE_SIZE(_, __, memrep)