5#ifndef V8_TORQUE_TYPES_H_
6#define V8_TORQUE_TYPES_H_
65#define DECLARE_TYPE_BOILERPLATE(x) \
66 static x* cast(TypeBase* declarable) { \
67 DCHECK(declarable->Is##x()); \
68 return static_cast<x*>(declarable); \
70 static const x* cast(const TypeBase* declarable) { \
71 DCHECK(declarable->Is##x()); \
72 return static_cast<const x*>(declarable); \
74 static x* DynamicCast(TypeBase* declarable) { \
75 if (!declarable) return nullptr; \
76 if (!declarable->Is##x()) return nullptr; \
77 return static_cast<x*>(declarable); \
79 static const x* DynamicCast(const TypeBase* declarable) { \
80 if (!declarable) return nullptr; \
81 if (!declarable->Is##x()) return nullptr; \
82 return static_cast<const x*>(declarable); \
108 virtual bool IsSubtypeOf(
const Type* supertype)
const;
115 virtual std::string SimpleName()
const;
118 std::string GetHandleTypeName(HandleKind
kind,
119 const std::string& type_name)
const;
121 std::string TagglifiedCppTypeName()
const;
122 std::string HandlifiedCppTypeName(HandleKind
kind)
const;
125 bool IsVoid()
const {
return IsAbstractName(VOID_TYPE_STRING); }
126 bool IsNever()
const {
return IsAbstractName(NEVER_TYPE_STRING); }
127 bool IsBool()
const {
return IsAbstractName(BOOL_TYPE_STRING); }
129 return IsAbstractName(CONSTEXPR_BOOL_TYPE_STRING);
132 bool IsFloat32()
const {
return IsAbstractName(FLOAT32_TYPE_STRING); }
133 bool IsFloat64()
const {
return IsAbstractName(FLOAT64_TYPE_STRING); }
134 std::string GetGeneratedTypeName()
const;
135 std::string GetGeneratedTNodeTypeName()
const;
137 if (parent())
DCHECK(!parent()->IsConstexpr());
142 virtual std::string GetConstexprGeneratedTypeName()
const;
143 std::optional<const ClassType*> ClassSupertype()
const;
144 std::optional<const StructType*> StructSupertype()
const;
145 std::optional<const AggregateType*> AggregateSupertype()
const;
147 virtual std::string GetRuntimeType()
const;
148 virtual std::string GetDebugType()
const;
149 static const Type* CommonSupertype(
const Type* a,
const Type* b);
150 void AddAlias(std::string alias)
const { aliases_.insert(std::move(alias)); }
151 size_t id()
const {
return id_; }
153 return specialized_from_;
156 static std::optional<const Type*> MatchUnaryGeneric(
const Type* type,
159 static std::string ComputeName(
const std::string& basename,
162 constexpr_version_ =
type;
166 if (constexpr_version_)
return constexpr_version_;
167 if (IsConstexpr())
return this;
168 if (parent())
return parent()->ConstexprVersion();
172 virtual size_t AlignmentLog2()
const;
186 bool IsAbstractName(
const std::string& name)
const;
193 mutable const Type* constexpr_version_ =
nullptr;
198 for (
const Type* t : types) {
221 std::optional<ClassFieldIndexInfo>
index;
294 const std::string& name,
const std::string& generated_type,
295 const Type* non_constexpr_version,
311 if (non_constexpr_version ==
nullptr) {
312 ReportError(
"Cannot find non-constexpr type corresponding to ", *
this);
314 return "constexpr_" + non_constexpr_version->
SimpleName();
337 std::string ToExplicitString()
const override;
339 return parent()->GetGeneratedTypeName();
342 return parent()->GetGeneratedTNodeTypeName();
356 return parameter_types_ == other.parameter_types_ &&
362 return {{
"Smi",
""}};
365 bool HasContextParameter()
const;
370 const Type* return_type,
size_t function_pointer_type_id)
371 :
Type(
Kind::kBuiltinPointerType, parent),
372 parameter_types_(parameter_types),
374 function_pointer_type_id_(function_pointer_type_id) {}
375 std::string SimpleNameImpl()
const override;
392 std::
string GetGeneratedTypeNameImpl()
const override {
393 return "TNode<" + GetGeneratedTNodeTypeName() +
">";
395 std::string GetGeneratedTNodeTypeNameImpl()
const override;
396 std::string GetRuntimeType()
const override;
397 std::string GetDebugType()
const override;
398 std::string GetConstexprGeneratedTypeName()
const override;
408 return types_ == other.types_;
412 if (types_.size() == 1) {
414 return *types_.begin();
420 for (
const Type* member : types_) {
421 if (!member->IsSubtypeOf(other))
return false;
427 for (
const Type* member : types_) {
428 if (other->IsSubtypeOf(member)) {
436 for (
const Type* member : types_) {
437 if (member->IsTransient()) {
444 bool IsConstexpr()
const override {
return parent()->IsConstexpr(); }
447 if (!IsConstexpr())
return this;
448 return parent()->NonConstexprVersion();
452 if (
const UnionType* union_type = UnionType::DynamicCast(t)) {
453 for (
const Type* member : union_type->types_) {
457 if (t->IsSubtypeOf(
this))
return;
458 set_parent(CommonSupertype(parent(), t));
464 std::string ToExplicitString()
const override;
466 void Subtract(
const Type* t);
469 const UnionType* union_type = UnionType::DynamicCast(t);
474 std::vector<TypeChecker>
result;
475 for (
const Type* member : types_) {
476 std::vector<TypeChecker> sub_result = member->GetTypeCheckers();
477 result.insert(
result.end(), sub_result.begin(), sub_result.end());
484 void RecomputeParent();
485 std::string SimpleNameImpl()
const override;
487 static void InsertGeneratedTNodeTypeName(std::set<std::string>& names,
489 static void InsertConstexprGeneratedTypeName(std::set<std::string>& names,
507 std::string ToExplicitString()
const override;
509 return parent()->GetGeneratedTypeName();
512 return parent()->GetGeneratedTNodeTypeName();
516 return parent()->GetTypeCheckers();
521 return parent()->ConstexprVersion();
526 const std::string&
name()
const {
return decl_->name->value; }
527 const std::vector<BitField>&
fields()
const {
return fields_; }
529 const BitField& LookupField(
const std::string& name)
const;
537 :
Type(
Kind::kBitFieldStructType, parent),
556 const std::vector<Field>&
fields()
const {
560 bool HasField(
const std::string& name)
const;
575 std::vector<Method*>
Methods(
const std::string& name)
const;
579 return {{
name_,
""}};
583 for (std::optional<const AggregateType*> current =
this;
586 const std::vector<Field>&
fields = (*current)->fields_;
589 ReportError(
"Can't get last field of empty aggregate type");
594 const std::string& name,
664 if (a == b)
return {a};
743 if (
parent() ==
nullptr)
return nullptr;
744 return parent()->IsClassType() ? ClassType::DynamicCast(
parent()) :
nullptr;
772 return decl_->instance_type_constraints;
790 std::optional<std::pair<int, int>> range)
const;
798 ClassFlags flags,
const std::string& generates,
818template <
bool success = false>
820 static_assert(success,
821 "Using Type* with an ostream is usually a mistake. Did you "
822 "mean to use Type& instead? If you actually intended to print "
823 "a pointer, use static_cast<const void*>.");
829 return os << static_cast<const void*>(t);
837 DCHECK(type->IsConstexpr());
841 const Type* from_type);
844 DCHECK(!type->IsConstexpr());
863 const std::string& fieldname);
872 for (
auto& visit_result : *
this) {
873 result.push_back(visit_result.type());
918 transitioning(transitioning) {}
928 bool transitioning =
false;
952 size_t vararg_count = 0);
954std::optional<std::tuple<size_t, std::string>>
SizeOf(
const Type* type);
961 const ClassType& class_type,
Expression* array_size);
NameAndType name_and_type
AbstractType(const Type *parent, AbstractTypeFlags flags, const std::string &name, const std::string &generated_type, const Type *non_constexpr_version, MaybeSpecializationKey specialized_from)
std::vector< TypeChecker > GetTypeCheckers() const override
const Type * non_constexpr_version_
bool IsTransient() const override
std::string SimpleNameImpl() const override
const std::string & name() const
bool IsConstexpr() const final
bool UseParentTypeChecker() const
std::string GetGeneratedTypeNameImpl() const override
std::string ToExplicitString() const override
size_t AlignmentLog2() const override
const Type * NonConstexprVersion() const override
const std::string generated_type_
std::string GetGeneratedTNodeTypeNameImpl() const override
const Field & LookupFieldInternal(const std::string &name) const
const Field & LastField() const
std::vector< Field > fields_
AggregateType(Kind kind, const Type *parent, Namespace *nspace, const std::string &name, MaybeSpecializationKey specialized_from=std::nullopt)
Namespace * nspace() const
const Field & LookupField(const std::string &name) const
const std::string & name() const
const std::vector< Field > & fields() const
std::string GetGeneratedTNodeTypeNameImpl() const override
virtual void Finalize() const =0
void SetFields(std::vector< Field > fields)
std::string GetGeneratedTypeNameImpl() const override
virtual const Field & RegisterField(Field field)
void CheckForDuplicateFields() const
std::vector< TypeChecker > GetTypeCheckers() const override
std::vector< Method * > methods_
void RegisterMethod(Method *method)
std::vector< const AggregateType * > GetHierarchy() const
std::string SimpleNameImpl() const override
const std::vector< Method * > & Methods() const
bool HasField(const std::string &name) const
const std::vector< BitField > & fields() const
const SourcePosition GetPosition() const
std::vector< TypeChecker > GetTypeCheckers() const override
const std::string & name() const
std::string GetGeneratedTNodeTypeNameImpl() const override
BitFieldStructType(Namespace *nspace, const Type *parent, const BitFieldStructDeclaration *decl)
std::vector< BitField > fields_
std::string SimpleNameImpl() const override
void RegisterField(BitField field)
const BitFieldStructDeclaration * decl_
const Type * ConstexprVersion() const override
std::string GetGeneratedTypeNameImpl() const override
void SetConstexprVersion(const Type *) const override
const Type *const return_type_
BuiltinPointerType(const Type *parent, TypeVector parameter_types, const Type *return_type, size_t function_pointer_type_id)
const TypeVector parameter_types_
const size_t function_pointer_type_id_
const TypeVector & parameter_types() const
std::string GetGeneratedTypeNameImpl() const override
const Type * return_type() const
std::vector< TypeChecker > GetTypeCheckers() const override
friend size_t hash_value(const BuiltinPointerType &p)
bool operator==(const BuiltinPointerType &other) const
size_t function_pointer_type_id() const
std::string GetGeneratedTNodeTypeNameImpl() const override
const ClassType * GetSuperClass() const
bool DoNotGenerateCast() const
const Field & RegisterField(Field field) override
bool IsLayoutDefinedInCpp() const
bool IsLowestInstanceTypeWithinParent() const
bool ShouldGenerateCppObjectLayoutDefinitionAsserts() const
SourcePosition GetPosition() const
bool ShouldGenerateFactoryFunction() const
const ClassType * GetClassDeclaringField(const Field &f) const
std::optional< ObjectSlotKind > ComputeArraySlotKind() const
bool ShouldGenerateFullClassDefinition() const
const InstanceTypeConstraints & GetInstanceTypeConstraints() const
std::optional< std::pair< int, int > > InstanceTypeRange() const
bool IsHighestInstanceTypeWithinParent() const
bool ShouldGenerateBodyDescriptor() const
void Finalize() const override
size_t header_size() const
std::optional< int > own_instance_type_
ClassType(const Type *parent, Namespace *nspace, const std::string &name, ClassFlags flags, const std::string &generates, const ClassDeclaration *decl, const TypeAlias *alias)
bool ShouldGenerateUniqueMap() const
std::string GetGeneratedTNodeTypeNameImpl() const override
std::optional< int > OwnInstanceType() const
bool HasNoPointerSlotsExceptMap() const
const Field * GetFieldPreceding(size_t field_index) const
ResidueClass size() const
bool IsTransient() const override
bool HasStaticSize() const
void InitializeInstanceTypes(std::optional< int > own, std::optional< std::pair< int, int > > range) const
std::string GetGeneratedTypeNameImpl() const override
bool HasSameInstanceTypeAsParent() const
std::string GetSliceMacroName(const Field &field) const
bool ShouldGenerateVerify() const
void GenerateSliceAccessor(size_t field_index)
std::string ToExplicitString() const override
bool ShouldGenerateCppClassDefinitions() const
const ClassDeclaration * decl_
bool AllowInstantiation() const
std::vector< Field > ComputeHeaderFields() const
std::vector< Field > ComputeAllFields() const
SourceId AttributedToFile() const
bool HasUndefinedLayout() const
bool HasIndexedFieldsIncludingInParents() const
bool ShouldExport() const
const std::string generates_
std::vector< Field > ComputeArrayFields() const
std::vector< ObjectSlotKind > ComputeHeaderSlotKinds() const
bool ShouldGenerateCppObjectDefinitionAsserts() const
bool ShouldGeneratePrint() const
std::optional< std::pair< int, int > > instance_type_range_
std::string generated_type_name_
std::string GetGeneratedTypeNameImpl() const override
size_t AlignmentLog2() const override
const StructDeclaration * decl_
std::string SimpleNameImpl() const override
SourcePosition GetPosition() const
void Finalize() const override
Classification ClassifyContents() const
std::string ToExplicitString() const override
StructType(Namespace *nspace, const StructDeclaration *decl, MaybeSpecializationKey specialized_from=std::nullopt)
size_t PackedSize() const
std::string GetGeneratedTypeNameImpl() const override
const Type * source_type() const
std::string ToExplicitString() const override
const Type * source_type_
TopType(std::string reason, const Type *source_type)
std::string SimpleNameImpl() const override
std::string GetGeneratedTNodeTypeNameImpl() const override
const std::string reason() const
bool IsAggregateType() const
bool IsStructType() const
bool IsBuiltinPointerType() const
bool IsAbstractType() const
bool IsBitFieldStructType() const
virtual ~TypeBase()=default
Type & operator=(const Type &other)=delete
bool IsConstexprBool() const
virtual bool IsTransient() const
virtual void SetConstexprVersion(const Type *type) const
virtual std::string GetGeneratedTNodeTypeNameImpl() const =0
MaybeSpecializationKey specialized_from_
virtual bool IsSubtypeOf(const Type *supertype) const
virtual const Type * NonConstexprVersion() const
std::optional< const AggregateType * > AggregateSupertype() const
virtual std::string ToExplicitString() const =0
virtual std::string SimpleNameImpl() const =0
virtual std::string GetGeneratedTypeNameImpl() const =0
bool IsVoidOrNever() const
const MaybeSpecializationKey & GetSpecializedFrom() const
virtual const Type * ConstexprVersion() const
void AddAlias(std::string alias) const
void set_parent(const Type *t)
virtual std::string SimpleName() const
virtual std::vector< TypeChecker > GetTypeCheckers() const
std::set< std::string > aliases_
virtual bool IsConstexpr() const
const Type * parent() const
std::set< const Type *, TypeLess > types_
void Extend(const Type *t)
bool IsSupertypeOf(const Type *other) const
bool IsSubtypeOf(const Type *other) const override
static UnionType FromType(const Type *t)
friend size_t hash_value(const UnionType &p)
std::optional< const Type * > GetSingleMember() const
const Type * NonConstexprVersion() const override
bool IsConstexpr() const override
bool IsTransient() const override
std::vector< TypeChecker > GetTypeCheckers() const override
bool operator==(const UnionType &other) const
TypeVector ComputeTypeVector() const
VisitResultVector(std::initializer_list< VisitResult > init)
static VisitResult NeverResult()
static VisitResult TopTypeResult(std::string top_reason, const Type *from_type)
bool operator==(const VisitResult &other) const
const Type * type() const
VisitResult(const Type *type, const std::string &constexpr_value)
VisitResult(const Type *type, StackRange stack_range)
const StackRange & stack_range() const
const std::string & constexpr_value() const
std::optional< std::string > constexpr_value_
std::optional< StackRange > stack_range_
void SetType(const Type *new_type)
constexpr const char * ToString(DataViewOp op)
ZoneVector< RpoNumber > & result
V8_INLINE size_t hash_combine(size_t seed, size_t hash)
bool operator<(const Type &a, const Type &b)
bool IsAssignableFrom(const Type *to, const Type *from)
std::ostream & operator<<(std::ostream &os, Identifier *id)
size_t LoweredSlotCount(const Type *type)
std::optional< NameAndType > ExtractSimpleFieldArraySize(const ClassType &class_type, Expression *array_size)
void EraseIf(Container *container, F f)
std::vector< NameAndType > NameAndTypeVector
void ReportError(Args &&... args)
bool IsAnyUnsignedInteger(const Type *type)
std::vector< LabelDeclaration > LabelDeclarationVector
void PrintSignature(std::ostream &os, const Signature &sig, bool with_names)
VisitResult ProjectStructField(VisitResult structure, const std::string &fieldname)
std::vector< LabelDefinition > LabelDefinitionVector
std::vector< Identifier * > NameVector
std::optional< SpecializationKey< GenericType > > MaybeSpecializationKey
bool Is32BitIntegralType(const Type *type)
bool IsAllowedAsBitField(const Type *type)
std::optional< std::tuple< size_t, std::string > > SizeOf(const Type *type)
bool IsPointerSizeIntegralType(const Type *type)
std::optional< ObjectSlotKind > Combine(ObjectSlotKind a, ObjectSlotKind b)
std::vector< const Type * > TypeVector
bool IsConstexprName(const std::string &name)
size_t hash_value(const TypeVector &types)
TypeVector LowerType(const Type *type)
const Type * SubtractType(const Type *a, const Type *b)
@ kGenerateCppClassDefinitions
@ kCppObjectLayoutDefinition
@ kHasSameInstanceTypeAsParent
@ kGenerateBodyDescriptor
@ kLowestInstanceTypeWithinParent
@ kGenerateFactoryFunction
@ kHighestInstanceTypeWithinParent
TypeVector LowerParameterTypes(const TypeVector ¶meters)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
BytecodeSequenceNode * parent_
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
NameAndType name_and_type
std::optional< ClassFieldIndexInfo > index
NameAndType name_and_type
FieldSynchronization synchronization
std::optional< size_t > offset
std::tuple< size_t, std::string > GetFieldSizeInformation() const
void ValidateAlignment(ResidueClass at_offset) const
const AggregateType * aggregate
NameAndTypeVector parameters
LabelDeclarationVector labels
NameVector parameter_names
ParameterTypes parameter_types
Signature(NameVector n, std::optional< std::string > arguments_variable, ParameterTypes p, size_t i, const Type *r, LabelDeclarationVector l, bool transitioning)
size_t ExplicitCount() const
bool HasContextParameter() const
bool HasSameTypesAs(const Signature &other, ParameterMode mode=ParameterMode::kProcessImplicit) const
TypeVector GetExplicitTypes() const
TypeVector GetImplicitTypes() const
const TypeVector & types() const
std::optional< std::string > arguments_variable
TypeVector specialized_types
bool operator()(const Type *const a, const Type *const b) const
#define DECLARE_TYPE_BOILERPLATE(x)