Move core type info to a Flag. Currently we check the type info name for a prefix of `core::` to determine if a type is core or not. Instead, add a new `kCore` Flag which is set in all the types in core/type. Change-Id: If24024088f84ac40b016a79fdaa1a835fa04ce9a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/324435 Reviewed-by: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Steven Perron <stevenperron@google.com> Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/tint/lang/core/ir/structural_validator.cc b/src/tint/lang/core/ir/structural_validator.cc index af2d49e..99a0809 100644 --- a/src/tint/lang/core/ir/structural_validator.cc +++ b/src/tint/lang/core/ir/structural_validator.cc
@@ -93,11 +93,6 @@ return false; } -/// @returns true if @p type is in the core namespace -bool IsCoreType(const core::type::Type* type) { - return std::string_view(type->TypeInfo().name).starts_with("tint::core"); -} - template <typename CTX, typename IMPL> void WalkTypeAndMembers(CTX& ctx, const core::type::Type* type, @@ -646,7 +641,7 @@ return; } - if (!ir_.properties.Contains(Property::kAllowNonCoreTypes) && !IsCoreType(root)) { + if (!ir_.properties.Contains(Property::kAllowNonCoreTypes) && !root->IsCore()) { diag() << "non-core types not allowed in core IR"; return; }
diff --git a/src/tint/lang/core/type/abstract_numeric.cc b/src/tint/lang/core/type/abstract_numeric.cc index 819b86c..dc1b19c 100644 --- a/src/tint/lang/core/type/abstract_numeric.cc +++ b/src/tint/lang/core/type/abstract_numeric.cc
@@ -34,6 +34,7 @@ AbstractNumeric::AbstractNumeric(size_t hash) : Base(hash, core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/array.cc b/src/tint/lang/core/type/array.cc index 8c74c52..63df602 100644 --- a/src/tint/lang/core/type/array.cc +++ b/src/tint/lang/core/type/array.cc
@@ -43,7 +43,8 @@ namespace { core::type::Flags FlagsFrom(const Type* element, const ArrayCount* count) { - core::type::Flags flags; + core::type::Flags flags{Flag::kCore}; + // Only constant-expression sized arrays are constructible if (count->Is<ConstantArrayCount>()) { if (element->IsConstructible()) {
diff --git a/src/tint/lang/core/type/atomic.cc b/src/tint/lang/core/type/atomic.cc index d72476d..af5339c 100644 --- a/src/tint/lang/core/type/atomic.cc +++ b/src/tint/lang/core/type/atomic.cc
@@ -41,6 +41,7 @@ Atomic::Atomic(const core::type::Type* subtype) : Base(Hash(tint::TypeCode::Of<Atomic>().bits, subtype), core::type::Flags{ + Flag::kCore, Flag::kCreationFixedFootprint, Flag::kFixedFootprint, Flag::kHostShareable,
diff --git a/src/tint/lang/core/type/binding_array.cc b/src/tint/lang/core/type/binding_array.cc index b991f1d..eea51cd 100644 --- a/src/tint/lang/core/type/binding_array.cc +++ b/src/tint/lang/core/type/binding_array.cc
@@ -40,7 +40,7 @@ namespace tint::core::type { BindingArray::BindingArray(const Type* element, const ArrayCount* count) - : Base(Hash(tint::TypeCode::Of<BindingArray>().bits, count), core::type::Flags{}), + : Base(Hash(tint::TypeCode::Of<BindingArray>().bits, count), core::type::Flags{Flag::kCore}), element_(element), count_(count) { TINT_ASSERT(element_);
diff --git a/src/tint/lang/core/type/bool.cc b/src/tint/lang/core/type/bool.cc index 1a86fed..c8ee8b5 100644 --- a/src/tint/lang/core/type/bool.cc +++ b/src/tint/lang/core/type/bool.cc
@@ -36,6 +36,7 @@ Bool::Bool() : Base(static_cast<size_t>(tint::TypeCode::Of<Bool>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/buffer.cc b/src/tint/lang/core/type/buffer.cc index 009f376..9d93173 100644 --- a/src/tint/lang/core/type/buffer.cc +++ b/src/tint/lang/core/type/buffer.cc
@@ -33,8 +33,8 @@ namespace tint::core::type { -const core::type::Flags sizedFlags{Flag::kHostShareable, Flag::kFixedFootprint}; -const core::type::Flags unsizedFlags{Flag::kHostShareable}; +const core::type::Flags sizedFlags{Flag::kCore, Flag::kHostShareable, Flag::kFixedFootprint}; +const core::type::Flags unsizedFlags{Flag::kCore, Flag::kHostShareable}; Buffer::Buffer(const ArrayCount* size) : Base(Hash(tint::TypeCode::Of<Buffer>().bits, size),
diff --git a/src/tint/lang/core/type/f16.cc b/src/tint/lang/core/type/f16.cc index 0ee753d..cdff483 100644 --- a/src/tint/lang/core/type/f16.cc +++ b/src/tint/lang/core/type/f16.cc
@@ -36,6 +36,7 @@ F16::F16() : Base(static_cast<size_t>(tint::TypeCode::Of<F16>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/f32.cc b/src/tint/lang/core/type/f32.cc index a4cba58..f4374b1 100644 --- a/src/tint/lang/core/type/f32.cc +++ b/src/tint/lang/core/type/f32.cc
@@ -36,6 +36,7 @@ F32::F32() : Base(static_cast<size_t>(tint::TypeCode::Of<F32>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/function.cc b/src/tint/lang/core/type/function.cc index 6b703fe..9bd4a33 100644 --- a/src/tint/lang/core/type/function.cc +++ b/src/tint/lang/core/type/function.cc
@@ -34,7 +34,8 @@ namespace tint::core::type { Function::Function() - : Base(static_cast<size_t>(tint::TypeCode::Of<Function>().bits), core::type::Flags{}) {} + : Base(static_cast<size_t>(tint::TypeCode::Of<Function>().bits), + core::type::Flags{Flag::kCore}) {} Function::~Function() = default;
diff --git a/src/tint/lang/core/type/i32.cc b/src/tint/lang/core/type/i32.cc index 4942b48..8a04a1b 100644 --- a/src/tint/lang/core/type/i32.cc +++ b/src/tint/lang/core/type/i32.cc
@@ -36,6 +36,7 @@ I32::I32() : Base(static_cast<size_t>(tint::TypeCode::Of<I32>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/i8.cc b/src/tint/lang/core/type/i8.cc index 8ad133e..959d130 100644 --- a/src/tint/lang/core/type/i8.cc +++ b/src/tint/lang/core/type/i8.cc
@@ -36,6 +36,7 @@ I8::I8() : Base(static_cast<size_t>(tint::TypeCode::Of<I8>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/invalid.cc b/src/tint/lang/core/type/invalid.cc index cc929a8..b45a45a 100644 --- a/src/tint/lang/core/type/invalid.cc +++ b/src/tint/lang/core/type/invalid.cc
@@ -34,7 +34,8 @@ namespace tint::core::type { Invalid::Invalid() - : Base(static_cast<size_t>(tint::TypeCode::Of<Invalid>().bits), core::type::Flags{}) {} + : Base(static_cast<size_t>(tint::TypeCode::Of<Invalid>().bits), + core::type::Flags{Flag::kCore}) {} Invalid::~Invalid() = default;
diff --git a/src/tint/lang/core/type/matrix.cc b/src/tint/lang/core/type/matrix.cc index b53395f..379bca8 100644 --- a/src/tint/lang/core/type/matrix.cc +++ b/src/tint/lang/core/type/matrix.cc
@@ -41,6 +41,7 @@ Matrix::Matrix(const Vector* column_type, uint32_t columns) : Base(Hash(tint::TypeCode::Of<Vector>().bits, columns, column_type), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/memory_view.cc b/src/tint/lang/core/type/memory_view.cc index 6ea0d41..74e8493 100644 --- a/src/tint/lang/core/type/memory_view.cc +++ b/src/tint/lang/core/type/memory_view.cc
@@ -38,7 +38,7 @@ core::AddressSpace address_space, const Type* store_type, core::Access access) - : Base(hash, core::type::Flags{}), + : Base(hash, core::type::Flags{Flag::kCore}), store_type_(store_type), address_space_(address_space), access_(access) {
diff --git a/src/tint/lang/core/type/resource_table.cc b/src/tint/lang/core/type/resource_table.cc index 6fe76bf..4e9e7e9 100644 --- a/src/tint/lang/core/type/resource_table.cc +++ b/src/tint/lang/core/type/resource_table.cc
@@ -37,7 +37,7 @@ ResourceTable::ResourceTable(const core::type::Type* binding_type) : Base(static_cast<size_t>(Hash(tint::TypeCode::Of<ResourceTable>().bits, binding_type)), - core::type::Flags{}), + core::type::Flags{Flag::kCore}), binding_type_(binding_type) {} bool ResourceTable::Equals(const UniqueNode& other) const {
diff --git a/src/tint/lang/core/type/sampler.cc b/src/tint/lang/core/type/sampler.cc index e70c368..b09dcd7 100644 --- a/src/tint/lang/core/type/sampler.cc +++ b/src/tint/lang/core/type/sampler.cc
@@ -35,7 +35,8 @@ namespace tint::core::type { Sampler::Sampler(SamplerKind kind) - : Base(Hash(tint::TypeCode::Of<Sampler>().bits, kind), core::type::Flags{}), kind_(kind) {} + : Base(Hash(tint::TypeCode::Of<Sampler>().bits, kind), core::type::Flags{Flag::kCore}), + kind_(kind) {} Sampler::~Sampler() = default;
diff --git a/src/tint/lang/core/type/string.cc b/src/tint/lang/core/type/string.cc index 25c372d..35c3ee2 100644 --- a/src/tint/lang/core/type/string.cc +++ b/src/tint/lang/core/type/string.cc
@@ -39,7 +39,7 @@ namespace tint::core::type { -String::String() : Base(Hash(tint::TypeCode::Of<String>().bits), core::type::Flags{}) {} +String::String() : Base(Hash(tint::TypeCode::Of<String>().bits), core::type::Flags{Flag::kCore}) {} bool String::Equals(const UniqueNode& other) const { return other.Is<String>();
diff --git a/src/tint/lang/core/type/struct.cc b/src/tint/lang/core/type/struct.cc index 6db3275..562b5b9 100644 --- a/src/tint/lang/core/type/struct.cc +++ b/src/tint/lang/core/type/struct.cc
@@ -53,10 +53,8 @@ Flags FlagsFrom(VectorRef<const StructMember*> members) { Flags flags{ - Flag::kConstructable, - Flag::kCreationFixedFootprint, - Flag::kFixedFootprint, - Flag::kHostShareable, + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, + Flag::kFixedFootprint, Flag::kHostShareable, }; for (auto* member : members) { if (!member->Type()->IsConstructible()) {
diff --git a/src/tint/lang/core/type/subgroup_matrix.cc b/src/tint/lang/core/type/subgroup_matrix.cc index cc12722..a394d87 100644 --- a/src/tint/lang/core/type/subgroup_matrix.cc +++ b/src/tint/lang/core/type/subgroup_matrix.cc
@@ -39,6 +39,7 @@ uint32_t rows) : Base(Hash(tint::TypeCode::Of<SubgroupMatrix>().bits, kind, columns, rows, subtype), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/texture.cc b/src/tint/lang/core/type/texture.cc index acd271c..0538891 100644 --- a/src/tint/lang/core/type/texture.cc +++ b/src/tint/lang/core/type/texture.cc
@@ -31,7 +31,8 @@ namespace tint::core::type { -Texture::Texture(size_t hash, TextureDimension dim) : Base(hash, core::type::Flags{}), dim_(dim) {} +Texture::Texture(size_t hash, TextureDimension dim) + : Base(hash, core::type::Flags{Flag::kCore}), dim_(dim) {} Texture::~Texture() = default;
diff --git a/src/tint/lang/core/type/type.h b/src/tint/lang/core/type/type.h index fa367fe..e7779ab 100644 --- a/src/tint/lang/core/type/type.h +++ b/src/tint/lang/core/type/type.h
@@ -45,6 +45,9 @@ /// Flag is an enumerator of type flag bits, used by Flags. enum Flag { + /// Type is core to Tint. (Note, this doesn't mean it's core in WGSL, it may be from an + /// extension but it is _not_ a dialect type.) + kCore, /// Type is constructable. /// @see https://gpuweb.github.io/gpuweb/wgsl/#constructible-types kConstructable, @@ -114,6 +117,9 @@ /// @returns the flags on the type core::type::Flags Flags() { return flags_; } + /// @returns true if the type is part of the core types + inline bool IsCore() const { return flags_.Contains(Flag::kCore); } + /// @returns true if type is constructable /// https://gpuweb.github.io/gpuweb/wgsl/#constructible-types inline bool IsConstructible() const { return flags_.Contains(Flag::kConstructable); }
diff --git a/src/tint/lang/core/type/u16.cc b/src/tint/lang/core/type/u16.cc index 04e6659..7bed56a 100644 --- a/src/tint/lang/core/type/u16.cc +++ b/src/tint/lang/core/type/u16.cc
@@ -36,6 +36,7 @@ U16::U16() : Base(static_cast<size_t>(tint::TypeCode::Of<U16>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u32.cc b/src/tint/lang/core/type/u32.cc index c1b2910..2f121e9 100644 --- a/src/tint/lang/core/type/u32.cc +++ b/src/tint/lang/core/type/u32.cc
@@ -36,6 +36,7 @@ U32::U32() : Base(static_cast<size_t>(tint::TypeCode::Of<U32>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u64.cc b/src/tint/lang/core/type/u64.cc index cffb248..a437735 100644 --- a/src/tint/lang/core/type/u64.cc +++ b/src/tint/lang/core/type/u64.cc
@@ -36,6 +36,7 @@ U64::U64() : Base(static_cast<size_t>(tint::TypeCode::Of<U64>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/u8.cc b/src/tint/lang/core/type/u8.cc index 68bf7f5..a51b338 100644 --- a/src/tint/lang/core/type/u8.cc +++ b/src/tint/lang/core/type/u8.cc
@@ -36,6 +36,7 @@ U8::U8() : Base(static_cast<size_t>(tint::TypeCode::Of<U8>().bits), core::type::Flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/vector.cc b/src/tint/lang/core/type/vector.cc index 5662735..865681d 100644 --- a/src/tint/lang/core/type/vector.cc +++ b/src/tint/lang/core/type/vector.cc
@@ -41,6 +41,7 @@ core::type::Flags FlagsFrom(const Type* element) { core::type::Flags flags{ + Flag::kCore, Flag::kConstructable, Flag::kCreationFixedFootprint, Flag::kFixedFootprint,
diff --git a/src/tint/lang/core/type/void.cc b/src/tint/lang/core/type/void.cc index 7e1fbf2..4e6a977 100644 --- a/src/tint/lang/core/type/void.cc +++ b/src/tint/lang/core/type/void.cc
@@ -33,7 +33,8 @@ namespace tint::core::type { -Void::Void() : Base(static_cast<size_t>(tint::TypeCode::Of<Void>().bits), core::type::Flags{}) {} +Void::Void() + : Base(static_cast<size_t>(tint::TypeCode::Of<Void>().bits), core::type::Flags{Flag::kCore}) {} Void::~Void() = default;