Changeset 248395 in webkit
- Timestamp:
- Aug 7, 2019 4:47:49 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r248389 r248395 1 2019-08-07 Sam Weinig <weinig@apple.com> 2 3 [WHLSL] Metal code generation takes a long time uniquing UnnamedTypes 4 https://bugs.webkit.org/show_bug.cgi?id=200512 5 6 Reviewed by Saam Barati. 7 8 Instead of using a trie for unnamed type uniquing, use the same technique used 9 in SynthesizeConstructors and use a HashMap of UnnamedTypeKeys. To make this 10 profitable, we also need to devirtualize the hash and equality functions on 11 UnnamedType, instead using an enum + switch. While this change only devirtualizes 12 the UnnamedType subtree, we should probably do it for the entire AST in a future 13 change. 14 15 * Modules/webgpu/WHLSL/AST/WHLSLArrayReferenceType.h: 16 * Modules/webgpu/WHLSL/AST/WHLSLArrayType.h: 17 * Modules/webgpu/WHLSL/AST/WHLSLPointerType.h: 18 * Modules/webgpu/WHLSL/AST/WHLSLReferenceType.h: 19 * Modules/webgpu/WHLSL/AST/WHLSLTypeReference.h: 20 * Modules/webgpu/WHLSL/AST/WHLSLUnnamedType.cpp: Added. 21 (WebCore::WHLSL::AST::UnnamedType::hash const): 22 (WebCore::WHLSL::AST::UnnamedType::operator== const): 23 * Modules/webgpu/WHLSL/AST/WHLSLUnnamedType.h: 24 Devirtualize hash, operator== and type predicates. 25 26 * Modules/webgpu/WHLSL/AST/WHLSLUnnamedTypeHash.h: Added. 27 (WebCore::WHLSL::UnnamedTypeKey::UnnamedTypeKey): 28 * Modules/webgpu/WHLSL/WHLSLSynthesizeConstructors.cpp: 29 (WebCore::WHLSL::UnnamedTypeKey::UnnamedTypeKey): Deleted. 30 Moved UnnamedTypeKey into it's own header from WHLSLSynthesizeConstructors.cpp 31 32 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp: 33 (WebCore::WHLSL::Metal::BaseTypeNameNode::BaseTypeNameNode): 34 (WebCore::WHLSL::Metal::BaseTypeNameNode::kind): 35 (WebCore::WHLSL::Metal::BaseTypeNameNode::isReferenceTypeNameNode const): 36 (WebCore::WHLSL::Metal::BaseTypeNameNode::isPointerTypeNameNode const): 37 (WebCore::WHLSL::Metal::BaseTypeNameNode::isArrayReferenceTypeNameNode const): 38 (WebCore::WHLSL::Metal::BaseTypeNameNode::isArrayTypeNameNode const): 39 Devirtualize BaseTypeNameNode as well. In a future change, we should consider removing 40 this class entirely and instead mapping directly to a parent/mangled name pair. 41 42 (WebCore::WHLSL::Metal::TypeNamer::visit): 43 (WebCore::WHLSL::Metal::TypeNamer::find): 44 (WebCore::WHLSL::Metal::TypeNamer::createNameNode): 45 (WebCore::WHLSL::Metal::parent): 46 (WebCore::WHLSL::Metal::TypeNamer::insert): 47 (WebCore::WHLSL::Metal::TypeNamer::emitUnnamedTypeDefinition): 48 (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDefinitions): 49 (WebCore::WHLSL::Metal::TypeNamer::mangledNameForType): 50 (WebCore::WHLSL::Metal::findInVector): Deleted. 51 (WebCore::WHLSL::Metal::find): Deleted. 52 (WebCore::WHLSL::Metal::TypeNamer::emitAllUnnamedTypeDefinitions): Deleted. 53 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h: 54 Switch from a Vector based trie to a HashMap for UnnamedType uniquing. Also 55 use UnnamedType::Kind where possible with switch statements to clarify code. 56 57 * WebCore.xcodeproj/project.pbxproj: 58 Add new files. 59 1 60 2019-08-07 Devin Rousso <drousso@apple.com> 2 61 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLArrayReferenceType.h
r248083 r248395 41 41 namespace AST { 42 42 43 class ArrayReferenceType : public ReferenceType {43 class ArrayReferenceType final : public ReferenceType { 44 44 WTF_MAKE_FAST_ALLOCATED; 45 45 WTF_MAKE_NONCOPYABLE(ArrayReferenceType); … … 47 47 48 48 ArrayReferenceType(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType) 49 : Base(location, addressSpace, WTFMove(elementType) )49 : Base(location, addressSpace, WTFMove(elementType), Kind::ArrayReferenceType) 50 50 { 51 51 } … … 58 58 virtual ~ArrayReferenceType() = default; 59 59 60 bool isArrayReferenceType() const override { return true; } 61 62 unsigned hash() const override 60 unsigned hash() const 63 61 { 64 62 return this->Base::hash() ^ StringHasher::computeLiteralHash("array"); 65 63 } 66 64 67 bool operator==(const UnnamedType& other) const override65 bool operator==(const ArrayReferenceType& other) const 68 66 { 69 if (!is<ArrayReferenceType>(other)) 70 return false; 71 72 return addressSpace() == downcast<ArrayReferenceType>(other).addressSpace() 73 && elementType() == downcast<ArrayReferenceType>(other).elementType(); 67 return addressSpace() == other.addressSpace() && elementType() == other.elementType(); 74 68 } 75 69 … … 78 72 return makeString(elementType().toString(), "[]"); 79 73 } 80 81 private:82 74 }; 83 75 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLArrayType.h
r248083 r248395 34 34 #include <wtf/Noncopyable.h> 35 35 #include <wtf/UniqueRef.h> 36 #include <wtf/text/StringConcatenateNumbers.h> 36 37 #include <wtf/text/WTFString.h> 37 38 … … 46 47 WTF_MAKE_NONCOPYABLE(ArrayType); 47 48 ArrayType(CodeLocation location, Ref<UnnamedType> elementType, unsigned numElements) 48 : UnnamedType(location )49 : UnnamedType(location, Kind::ArrayType) 49 50 , m_elementType(WTFMove(elementType)) 50 51 , m_numElements(numElements) … … 60 61 virtual ~ArrayType() = default; 61 62 62 bool isArrayType() const override { return true; }63 64 63 const UnnamedType& type() const { return m_elementType; } 65 64 UnnamedType& type() { return m_elementType; } 66 65 unsigned numElements() const { return m_numElements; } 67 66 68 unsigned hash() const override67 unsigned hash() const 69 68 { 70 69 return WTF::IntHash<unsigned>::hash(m_numElements) ^ m_elementType->hash(); 71 70 } 72 71 73 bool operator==(const UnnamedType& other) const override72 bool operator==(const ArrayType& other) const 74 73 { 75 if (!is<ArrayType>(other)) 76 return false; 77 78 return numElements() == downcast<ArrayType>(other).numElements() 79 && type() == downcast<ArrayType>(other).type(); 74 return numElements() == other.numElements() && type() == other.type(); 80 75 } 81 76 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLPointerType.h
r248307 r248395 47 47 48 48 PointerType(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType) 49 : Base(location, addressSpace, WTFMove(elementType) )49 : Base(location, addressSpace, WTFMove(elementType), Kind::PointerType) 50 50 { 51 51 } … … 59 59 virtual ~PointerType() = default; 60 60 61 bool isPointerType() const override { return true; } 62 63 unsigned hash() const override 61 unsigned hash() const 64 62 { 65 63 return this->Base::hash() ^ StringHasher::computeLiteralHash("pointer"); 66 64 } 67 65 68 bool operator==(const UnnamedType& other) const override66 bool operator==(const PointerType& other) const 69 67 { 70 if (!is<PointerType>(other)) 71 return false; 72 73 return addressSpace() == downcast<PointerType>(other).addressSpace() 74 && elementType() == downcast<PointerType>(other).elementType(); 68 return addressSpace() == other.addressSpace() && elementType() == other.elementType(); 75 69 } 76 70 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLReferenceType.h
r248083 r248395 45 45 WTF_MAKE_NONCOPYABLE(ReferenceType); 46 46 protected: 47 ReferenceType(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType )48 : UnnamedType(location )47 ReferenceType(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType, Kind kind) 48 : UnnamedType(location, kind) 49 49 , m_addressSpace(addressSpace) 50 50 , m_elementType(WTFMove(elementType)) … … 52 52 } 53 53 public: 54 55 54 virtual ~ReferenceType() = default; 56 57 bool isReferenceType() const override { return true; }58 55 59 56 AddressSpace addressSpace() const { return m_addressSpace; } … … 61 58 UnnamedType& elementType() { return m_elementType; } 62 59 63 unsigned hash() const override60 unsigned hash() const 64 61 { 65 62 return ~m_elementType->hash(); -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLTypeReference.h
r248083 r248395 49 49 WTF_MAKE_NONCOPYABLE(TypeReference); 50 50 TypeReference(CodeLocation location, String&& name, TypeArguments&& typeArguments) 51 : UnnamedType(location )51 : UnnamedType(location, Kind::TypeReference) 52 52 , m_name(WTFMove(name)) 53 53 , m_typeArguments(WTFMove(typeArguments)) … … 63 63 64 64 static Ref<TypeReference> wrap(CodeLocation, NamedType& resolvedType); 65 66 bool isTypeReference() const override { return true; }67 65 68 66 String& name() { return m_name; } … … 92 90 } 93 91 94 unsigned hash() const override92 unsigned hash() const 95 93 { 96 94 // Currently, we only use this function after the name resolver runs. … … 100 98 } 101 99 102 bool operator==(const UnnamedType& other) const override100 bool operator==(const TypeReference& other) const 103 101 { 104 102 ASSERT(m_resolvedType); 105 if (!is<TypeReference>(other)) 106 return false; 107 108 return &unifyNode() == &downcast<TypeReference>(other).unifyNode(); 103 return &unifyNode() == &other.unifyNode(); 109 104 } 110 105 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLUnnamedType.h
r248083 r248395 46 46 WTF_MAKE_NONCOPYABLE(UnnamedType); 47 47 public: 48 UnnamedType(CodeLocation location) 48 enum class Kind { 49 TypeReference, 50 PointerType, 51 ArrayReferenceType, 52 ArrayType 53 }; 54 55 UnnamedType(CodeLocation location, Kind kind) 49 56 : m_codeLocation(location) 57 , m_kind(kind) 50 58 { 51 59 } … … 54 62 55 63 bool isUnnamedType() const override { return true; } 56 virtual bool isTypeReference() const { return false; } 57 virtual bool isPointerType() const { return false; } 58 virtual bool isArrayReferenceType() const { return false; } 59 virtual bool isArrayType() const { return false; } 60 virtual bool isReferenceType() const { return false; } 64 65 Kind kind() const { return m_kind; } 66 bool isTypeReference() const { return m_kind == Kind::TypeReference; } 67 bool isPointerType() const { return m_kind == Kind::PointerType; } 68 bool isArrayReferenceType() const { return m_kind == Kind::ArrayReferenceType; } 69 bool isArrayType() const { return m_kind == Kind::ArrayType; } 70 bool isReferenceType() const { return isPointerType() || isArrayReferenceType(); } 61 71 62 72 virtual const Type& unifyNode() const { return *this; } 63 73 virtual Type& unifyNode() { return *this; } 64 74 65 virtual unsigned hash() const = 0;66 virtual bool operator==(const UnnamedType&) const = 0;75 unsigned hash() const; 76 bool operator==(const UnnamedType&) const; 67 77 68 78 virtual String toString() const = 0; … … 72 82 private: 73 83 CodeLocation m_codeLocation; 84 Kind m_kind; 74 85 }; 75 86 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp
r248307 r248395 59 59 namespace Metal { 60 60 61 // FIXME: Look into replacing BaseTypeNameNode with a simple struct { RefPtr<UnnamedType> parent; MangledTypeName; } that UnnamedTypeKeys map to. 61 62 class BaseTypeNameNode { 62 63 WTF_MAKE_FAST_ALLOCATED; 63 64 public: 64 BaseTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName )65 BaseTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::UnnamedType::Kind kind) 65 66 : m_parent(parent) 66 67 , m_mangledName(mangledName) 68 , m_kind(kind) 67 69 { 68 70 } 69 71 virtual ~BaseTypeNameNode() = default; 70 virtual bool isArrayTypeNameNode() const { return false; } 71 virtual bool isArrayReferenceTypeNameNode() const { return false; } 72 virtual bool isPointerTypeNameNode() const { return false; } 73 virtual bool isReferenceTypeNameNode() const { return false; } 74 Vector<UniqueRef<BaseTypeNameNode>>& children() { return m_children; } 75 void append(UniqueRef<BaseTypeNameNode>&& child) 76 { 77 m_children.append(WTFMove(child)); 78 } 72 73 AST::UnnamedType::Kind kind() { return m_kind; } 74 bool isReferenceTypeNameNode() const { return m_kind == AST::UnnamedType::Kind::TypeReference; } 75 bool isPointerTypeNameNode() const { return m_kind == AST::UnnamedType::Kind::PointerType; } 76 bool isArrayReferenceTypeNameNode() const { return m_kind == AST::UnnamedType::Kind::ArrayReferenceType; } 77 bool isArrayTypeNameNode() const { return m_kind == AST::UnnamedType::Kind::ArrayType; } 78 79 79 BaseTypeNameNode* parent() { return m_parent; } 80 80 MangledTypeName mangledName() const { return m_mangledName; } 81 81 82 82 private: 83 Vector<UniqueRef<BaseTypeNameNode>> m_children;84 83 BaseTypeNameNode* m_parent; 85 84 MangledTypeName m_mangledName; 86 }; 87 88 class ArrayTypeNameNode : public BaseTypeNameNode { 85 AST::UnnamedType::Kind m_kind; 86 }; 87 88 class ArrayTypeNameNode final : public BaseTypeNameNode { 89 89 WTF_MAKE_FAST_ALLOCATED; 90 90 public: 91 91 ArrayTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, unsigned numElements) 92 : BaseTypeNameNode(parent, WTFMove(mangledName) )92 : BaseTypeNameNode(parent, WTFMove(mangledName), AST::UnnamedType::Kind::ArrayType) 93 93 , m_numElements(numElements) 94 94 { 95 95 } 96 96 virtual ~ArrayTypeNameNode() = default; 97 bool isArrayTypeNameNode() const override { return true; }98 97 unsigned numElements() const { return m_numElements; } 99 98 … … 102 101 }; 103 102 104 class ArrayReferenceTypeNameNode : public BaseTypeNameNode {103 class ArrayReferenceTypeNameNode final : public BaseTypeNameNode { 105 104 WTF_MAKE_FAST_ALLOCATED; 106 105 public: 107 106 ArrayReferenceTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::AddressSpace addressSpace) 108 : BaseTypeNameNode(parent, WTFMove(mangledName) )107 : BaseTypeNameNode(parent, WTFMove(mangledName), AST::UnnamedType::Kind::ArrayReferenceType) 109 108 , m_addressSpace(addressSpace) 110 109 { 111 110 } 112 111 virtual ~ArrayReferenceTypeNameNode() = default; 113 bool isArrayReferenceTypeNameNode() const override { return true; }114 112 AST::AddressSpace addressSpace() const { return m_addressSpace; } 115 113 … … 118 116 }; 119 117 120 class PointerTypeNameNode : public BaseTypeNameNode {118 class PointerTypeNameNode final : public BaseTypeNameNode { 121 119 WTF_MAKE_FAST_ALLOCATED; 122 120 public: 123 121 PointerTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::AddressSpace addressSpace) 124 : BaseTypeNameNode(parent, WTFMove(mangledName) )122 : BaseTypeNameNode(parent, WTFMove(mangledName), AST::UnnamedType::Kind::PointerType) 125 123 , m_addressSpace(addressSpace) 126 124 { 127 125 } 128 126 virtual ~PointerTypeNameNode() = default; 129 bool isPointerTypeNameNode() const override { return true; }130 127 AST::AddressSpace addressSpace() const { return m_addressSpace; } 131 128 … … 134 131 }; 135 132 136 class ReferenceTypeNameNode : public BaseTypeNameNode {133 class ReferenceTypeNameNode final : public BaseTypeNameNode { 137 134 WTF_MAKE_FAST_ALLOCATED; 138 135 public: 139 136 ReferenceTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::NamedType& namedType) 140 : BaseTypeNameNode(parent, WTFMove(mangledName) )137 : BaseTypeNameNode(parent, WTFMove(mangledName), AST::UnnamedType::Kind::TypeReference) 141 138 , m_namedType(namedType) 142 139 { 143 140 } 144 141 virtual ~ReferenceTypeNameNode() = default; 145 bool isReferenceTypeNameNode() const override { return true; }146 142 AST::NamedType& namedType() { return m_namedType; } 147 143 … … 182 178 TypeNamer::~TypeNamer() = default; 183 179 184 static Vector<UniqueRef<BaseTypeNameNode>>::iterator findInVector(AST::UnnamedType& unnamedType, Vector<UniqueRef<BaseTypeNameNode>>& types)185 {186 return std::find_if(types.begin(), types.end(), [&](BaseTypeNameNode& baseTypeNameNode) -> bool {187 if (is<AST::TypeReference>(unnamedType) && is<ReferenceTypeNameNode>(baseTypeNameNode)) {188 auto& resolvedType = downcast<AST::TypeReference>(unnamedType).resolvedType();189 return &resolvedType == &downcast<ReferenceTypeNameNode>(baseTypeNameNode).namedType();190 }191 if (is<AST::PointerType>(unnamedType) && is<PointerTypeNameNode>(baseTypeNameNode))192 return downcast<AST::PointerType>(unnamedType).addressSpace() == downcast<PointerTypeNameNode>(baseTypeNameNode).addressSpace();193 if (is<AST::ArrayReferenceType>(unnamedType) && is<ArrayReferenceTypeNameNode>(baseTypeNameNode))194 return downcast<AST::ArrayReferenceType>(unnamedType).addressSpace() == downcast<ArrayReferenceTypeNameNode>(baseTypeNameNode).addressSpace();195 if (is<AST::ArrayType>(unnamedType) && is<ArrayTypeNameNode>(baseTypeNameNode))196 return downcast<AST::ArrayType>(unnamedType).numElements() == downcast<ArrayTypeNameNode>(baseTypeNameNode).numElements();197 return false;198 });199 }200 201 static BaseTypeNameNode& find(AST::UnnamedType& unnamedType, Vector<UniqueRef<BaseTypeNameNode>>& types)202 {203 auto& vectorToSearch = ([&]() -> Vector<UniqueRef<BaseTypeNameNode>>& {204 if (is<AST::TypeReference>(unnamedType))205 return types;206 if (is<AST::PointerType>(unnamedType))207 return find(downcast<AST::PointerType>(unnamedType).elementType(), types).children();208 if (is<AST::ArrayReferenceType>(unnamedType))209 return find(downcast<AST::ArrayReferenceType>(unnamedType).elementType(), types).children();210 return find(downcast<AST::ArrayType>(unnamedType).type(), types).children();211 })();212 auto iterator = findInVector(unnamedType, vectorToSearch);213 ASSERT(iterator != types.end());214 return *iterator;215 }216 217 180 void TypeNamer::visit(AST::UnnamedType& unnamedType) 218 181 { 219 insert(unnamedType , m_trie);182 insert(unnamedType); 220 183 } 221 184 … … 235 198 236 199 { 237 Vector<std::reference_wrapper<BaseTypeNameNode>> neighbors = { find(enumerationDefinition.type() , m_trie) };200 Vector<std::reference_wrapper<BaseTypeNameNode>> neighbors = { find(enumerationDefinition.type()) }; 238 201 auto addResult = m_dependencyGraph.add(&enumerationDefinition, WTFMove(neighbors)); 239 202 ASSERT_UNUSED(addResult, addResult.isNewEntry); … … 260 223 auto addResult = m_structureElementMapping.add(&structureElement, generateNextStructureElementName()); 261 224 ASSERT_UNUSED(addResult, addResult.isNewEntry); 262 neighbors.append(find(structureElement.type() , m_trie));225 neighbors.append(find(structureElement.type())); 263 226 } 264 227 auto addResult = m_dependencyGraph.add(&structureDefinition, WTFMove(neighbors)); … … 275 238 Visitor::visit(typeDefinition); 276 239 { 277 Vector<std::reference_wrapper<BaseTypeNameNode>> neighbors = { find(typeDefinition.type() , m_trie) };240 Vector<std::reference_wrapper<BaseTypeNameNode>> neighbors = { find(typeDefinition.type()) }; 278 241 auto addResult = m_dependencyGraph.add(&typeDefinition, WTFMove(neighbors)); 279 242 ASSERT_UNUSED(addResult, addResult.isNewEntry); … … 283 246 void TypeNamer::visit(AST::Expression& expression) 284 247 { 285 insert(expression.resolvedType() , m_trie);248 insert(expression.resolvedType()); 286 249 Visitor::visit(expression); 287 250 } … … 298 261 } 299 262 300 UniqueRef<BaseTypeNameNode> TypeNamer::createNameNode(AST::UnnamedType& unnamedType, BaseTypeNameNode* parent) 301 { 302 if (is<AST::TypeReference>(unnamedType)) { 263 BaseTypeNameNode& TypeNamer::find(AST::UnnamedType& unnamedType) 264 { 265 auto iterator = m_unnamedTypesUniquingMap.find(unnamedType); 266 ASSERT(iterator != m_unnamedTypesUniquingMap.end()); 267 return *iterator->value; 268 } 269 270 std::unique_ptr<BaseTypeNameNode> TypeNamer::createNameNode(AST::UnnamedType& unnamedType, BaseTypeNameNode* parent) 271 { 272 switch (unnamedType.kind()) { 273 case AST::UnnamedType::Kind::TypeReference: { 303 274 auto& typeReference = downcast<AST::TypeReference>(unnamedType); 304 return makeUniqueRef<ReferenceTypeNameNode>(parent, generateNextTypeName(), typeReference.resolvedType());305 } 306 if (is<AST::PointerType>(unnamedType)){275 return std::make_unique<ReferenceTypeNameNode>(parent, generateNextTypeName(), typeReference.resolvedType()); 276 } 277 case AST::UnnamedType::Kind::PointerType: { 307 278 auto& pointerType = downcast<AST::PointerType>(unnamedType); 308 return makeUniqueRef<PointerTypeNameNode>(parent, generateNextTypeName(), pointerType.addressSpace());309 } 310 if (is<AST::ArrayReferenceType>(unnamedType)){279 return std::make_unique<PointerTypeNameNode>(parent, generateNextTypeName(), pointerType.addressSpace()); 280 } 281 case AST::UnnamedType::Kind::ArrayReferenceType: { 311 282 auto& arrayReferenceType = downcast<AST::ArrayReferenceType>(unnamedType); 312 return makeUniqueRef<ArrayReferenceTypeNameNode>(parent, generateNextTypeName(), arrayReferenceType.addressSpace()); 313 } 314 auto& arrayType = downcast<AST::ArrayType>(unnamedType); 315 return makeUniqueRef<ArrayTypeNameNode>(parent, generateNextTypeName(), arrayType.numElements()); 316 } 317 318 BaseTypeNameNode* TypeNamer::insert(AST::UnnamedType& unnamedType, Vector<UniqueRef<BaseTypeNameNode>>& types) 283 return std::make_unique<ArrayReferenceTypeNameNode>(parent, generateNextTypeName(), arrayReferenceType.addressSpace()); 284 } 285 case AST::UnnamedType::Kind::ArrayType: { 286 auto& arrayType = downcast<AST::ArrayType>(unnamedType); 287 return std::make_unique<ArrayTypeNameNode>(parent, generateNextTypeName(), arrayType.numElements()); 288 } 289 } 290 } 291 292 static AST::UnnamedType* parent(AST::UnnamedType& unnamedType) 293 { 294 switch (unnamedType.kind()) { 295 case AST::UnnamedType::Kind::TypeReference: 296 return nullptr; 297 case AST::UnnamedType::Kind::PointerType: 298 return &downcast<AST::PointerType>(unnamedType).elementType(); 299 case AST::UnnamedType::Kind::ArrayReferenceType: 300 return &downcast<AST::ArrayReferenceType>(unnamedType).elementType(); 301 case AST::UnnamedType::Kind::ArrayType: 302 return &downcast<AST::ArrayType>(unnamedType).type(); 303 } 304 } 305 306 BaseTypeNameNode* TypeNamer::insert(AST::UnnamedType& unnamedType) 319 307 { 320 308 if (auto* result = m_unnamedTypeMapping.get(&unnamedType)) 321 309 return result; 322 310 323 Vector<UniqueRef<BaseTypeNameNode>>* vectorToInsertInto { nullptr }; 324 BaseTypeNameNode* parent { nullptr }; 325 if (is<AST::TypeReference>(unnamedType)) { 326 vectorToInsertInto = &types; 327 parent = nullptr; 328 } else if (is<AST::PointerType>(unnamedType)) { 329 parent = insert(downcast<AST::PointerType>(unnamedType).elementType(), types); 330 vectorToInsertInto = &parent->children(); 331 } else if (is<AST::ArrayReferenceType>(unnamedType)) { 332 parent = insert(downcast<AST::ArrayReferenceType>(unnamedType).elementType(), types); 333 vectorToInsertInto = &parent->children(); 334 } else { 335 parent = insert(downcast<AST::ArrayType>(unnamedType).type(), types); 336 vectorToInsertInto = &parent->children(); 337 } 338 ASSERT(vectorToInsertInto); 339 340 auto iterator = findInVector(unnamedType, *vectorToInsertInto); 341 if (iterator == vectorToInsertInto->end()) { 342 auto result = createNameNode(unnamedType, parent); 343 { 344 auto addResult = m_unnamedTypeMapping.add(&unnamedType, &result); 345 ASSERT_UNUSED(addResult, addResult.isNewEntry); 346 } 347 vectorToInsertInto->append(WTFMove(result)); 348 return &vectorToInsertInto->last().get(); 349 } 350 m_unnamedTypeMapping.add(&unnamedType, &*iterator); 351 return &*iterator; 311 auto* parentUnnamedType = parent(unnamedType); 312 BaseTypeNameNode* parentNode = parentUnnamedType ? insert(*parentUnnamedType) : nullptr; 313 314 auto addResult = m_unnamedTypesUniquingMap.ensure(UnnamedTypeKey { unnamedType }, [&] { 315 return createNameNode(unnamedType, parentNode); 316 }); 317 318 m_unnamedTypeMapping.add(&unnamedType, addResult.iterator->value.get()); 319 return addResult.iterator->value.get(); 352 320 } 353 321 … … 383 351 if (emittedUnnamedTypes.contains(&baseTypeNameNode)) 384 352 return; 353 385 354 if (baseTypeNameNode.parent()) 386 355 emitUnnamedTypeDefinition(stringBuilder, *baseTypeNameNode.parent(), emittedNamedTypes, emittedUnnamedTypes); 387 if (is<ReferenceTypeNameNode>(baseTypeNameNode)) { 356 357 switch (baseTypeNameNode.kind()) { 358 case AST::UnnamedType::Kind::TypeReference: { 388 359 auto& namedType = downcast<ReferenceTypeNameNode>(baseTypeNameNode).namedType(); 389 360 emitNamedTypeDefinition(stringBuilder, namedType, emittedNamedTypes, emittedUnnamedTypes); 390 361 stringBuilder.flexibleAppend("typedef ", mangledNameForType(namedType), ' ', baseTypeNameNode.mangledName(), ";\n"); 391 } else if (is<PointerTypeNameNode>(baseTypeNameNode)) { 362 break; 363 } 364 case AST::UnnamedType::Kind::PointerType: { 392 365 auto& pointerType = downcast<PointerTypeNameNode>(baseTypeNameNode); 393 366 ASSERT(baseTypeNameNode.parent()); 394 367 stringBuilder.flexibleAppend("typedef ", toString(pointerType.addressSpace()), ' ', pointerType.parent()->mangledName(), "* ", pointerType.mangledName(), ";\n"); 395 } else if (is<ArrayReferenceTypeNameNode>(baseTypeNameNode)) { 368 break; 369 } 370 case AST::UnnamedType::Kind::ArrayReferenceType: { 396 371 auto& arrayReferenceType = downcast<ArrayReferenceTypeNameNode>(baseTypeNameNode); 397 372 ASSERT(baseTypeNameNode.parent()); … … 402 377 "};\n" 403 378 ); 404 } else { 379 break; 380 } 381 case AST::UnnamedType::Kind::ArrayType: { 405 382 auto& arrayType = downcast<ArrayTypeNameNode>(baseTypeNameNode); 406 383 ASSERT(baseTypeNameNode.parent()); 407 384 stringBuilder.flexibleAppend("typedef array<", arrayType.parent()->mangledName(), ", ", arrayType.numElements(), "> ", arrayType.mangledName(), ";\n"); 408 } 385 break; 386 } 387 } 388 409 389 emittedUnnamedTypes.add(&baseTypeNameNode); 410 390 } … … 440 420 } 441 421 442 void TypeNamer::emitAllUnnamedTypeDefinitions(StringBuilder& stringBuilder, Vector<UniqueRef<BaseTypeNameNode>>& nodes, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes)443 {444 for (auto& node : nodes) {445 emitUnnamedTypeDefinition(stringBuilder, node, emittedNamedTypes, emittedUnnamedTypes);446 emitAllUnnamedTypeDefinitions(stringBuilder, node->children(), emittedNamedTypes, emittedUnnamedTypes);447 }448 }449 450 422 void TypeNamer::emitMetalTypeDefinitions(StringBuilder& stringBuilder) 451 423 { 452 424 HashSet<AST::NamedType*> emittedNamedTypes; 453 425 HashSet<BaseTypeNameNode*> emittedUnnamedTypes; 454 for (auto& keyValuePair : m_dependencyGraph) 455 emitNamedTypeDefinition(stringBuilder, *keyValuePair.key, emittedNamedTypes, emittedUnnamedTypes); 456 emitAllUnnamedTypeDefinitions(stringBuilder, m_trie, emittedNamedTypes, emittedUnnamedTypes); 426 for (auto& namedType : m_dependencyGraph.keys()) 427 emitNamedTypeDefinition(stringBuilder, *namedType, emittedNamedTypes, emittedUnnamedTypes); 428 for (auto& node : m_unnamedTypesUniquingMap.values()) 429 emitUnnamedTypeDefinition(stringBuilder, *node, emittedNamedTypes, emittedUnnamedTypes); 457 430 } 458 431 459 432 MangledTypeName TypeNamer::mangledNameForType(AST::UnnamedType& unnamedType) 460 433 { 461 return find(unnamedType , m_trie).mangledName();434 return find(unnamedType).mangledName(); 462 435 } 463 436 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h
r248307 r248395 29 29 30 30 #include "WHLSLMangledNames.h" 31 #include "WHLSLUnnamedTypeHash.h" 31 32 #include "WHLSLVisitor.h" 32 33 #include <wtf/HashMap.h> … … 85 86 void emitNamedTypeDefinition(StringBuilder&, AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes); 86 87 void emitUnnamedTypeDefinition(StringBuilder&, BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes); 87 void emitAllUnnamedTypeDefinitions(StringBuilder&, Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes);88 88 void emitMetalTypeDeclarations(StringBuilder&); 89 89 void emitMetalTypeDefinitions(StringBuilder&); 90 90 91 UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent); 92 BaseTypeNameNode* insert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&); 91 std::unique_ptr<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent); 92 BaseTypeNameNode* insert(AST::UnnamedType&); 93 BaseTypeNameNode& find(AST::UnnamedType&); 93 94 94 95 Program& m_program; 95 Vector<UniqueRef<BaseTypeNameNode>> m_trie;96 HashMap<UnnamedTypeKey, std::unique_ptr<BaseTypeNameNode>, UnnamedTypeKey::Hash, UnnamedTypeKey::Traits> m_unnamedTypesUniquingMap; 96 97 HashMap<AST::UnnamedType*, BaseTypeNameNode*> m_unnamedTypeMapping; 97 98 HashMap<AST::NamedType*, MangledTypeName> m_namedTypeMapping; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLSynthesizeConstructors.cpp
r248303 r248395 39 39 #include "WHLSLStructureDefinition.h" 40 40 #include "WHLSLTypeReference.h" 41 #include "WHLSLUnnamedTypeHash.h" 41 42 #include "WHLSLVariableDeclaration.h" 42 43 #include "WHLSLVisitor.h" … … 45 46 46 47 namespace WHLSL { 47 48 class UnnamedTypeKey {49 public:50 UnnamedTypeKey() = default;51 UnnamedTypeKey(WTF::HashTableDeletedValueType)52 {53 m_type = bitwise_cast<AST::UnnamedType*>(static_cast<uintptr_t>(1));54 }55 56 UnnamedTypeKey(AST::UnnamedType& type)57 : m_type(&type)58 { }59 60 bool isEmptyValue() const { return !m_type; }61 bool isHashTableDeletedValue() const { return m_type == bitwise_cast<AST::UnnamedType*>(static_cast<uintptr_t>(1)); }62 63 unsigned hash() const { return m_type->hash(); }64 bool operator==(const UnnamedTypeKey& other) const { return *m_type == *other.m_type; }65 AST::UnnamedType& unnamedType() const { return *m_type; }66 67 struct Hash {68 static unsigned hash(const UnnamedTypeKey& key) { return key.hash(); }69 static bool equal(const UnnamedTypeKey& a, const UnnamedTypeKey& b) { return a == b; }70 static const bool safeToCompareToEmptyOrDeleted = false;71 static const bool emptyValueIsZero = true;72 };73 74 struct Traits : public WTF::SimpleClassHashTraits<UnnamedTypeKey> {75 static const bool hasIsEmptyValueFunction = true;76 static bool isEmptyValue(const UnnamedTypeKey& key) { return key.isEmptyValue(); }77 };78 79 private:80 AST::UnnamedType* m_type { nullptr };81 };82 48 83 49 class FindAllTypes : public Visitor { -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r248364 r248395 2232 2232 7C8139AA1ED6604B00CE26E8 /* JSDOMCastedThisErrorBehavior.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8139A91ED62DF200CE26E8 /* JSDOMCastedThisErrorBehavior.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2233 2233 7C83DE861D04CC5D00FEBCF3 /* SpringSolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C83DE851D04CBD400FEBCF3 /* SpringSolver.h */; }; 2234 7C85B20222FB04850030684F /* WHLSLUnnamedType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C85B20122FB04850030684F /* WHLSLUnnamedType.cpp */; }; 2234 2235 7C8E34AD1E4A33AF0054CE23 /* JSDOMConvertAny.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8E34921E4A338E0054CE23 /* JSDOMConvertAny.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2235 2236 7C8E34AE1E4A33AF0054CE23 /* JSDOMConvertBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C8E34931E4A338E0054CE23 /* JSDOMConvertBase.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 9742 9743 7C8139A91ED62DF200CE26E8 /* JSDOMCastedThisErrorBehavior.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMCastedThisErrorBehavior.h; sourceTree = "<group>"; }; 9743 9744 7C83DE851D04CBD400FEBCF3 /* SpringSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpringSolver.h; sourceTree = "<group>"; }; 9745 7C85B20122FB04850030684F /* WHLSLUnnamedType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WHLSLUnnamedType.cpp; sourceTree = "<group>"; }; 9746 7C85B20422FB06320030684F /* WHLSLUnnamedTypeHash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLUnnamedTypeHash.h; sourceTree = "<group>"; }; 9744 9747 7C8E34921E4A338E0054CE23 /* JSDOMConvertAny.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMConvertAny.h; sourceTree = "<group>"; }; 9745 9748 7C8E34931E4A338E0054CE23 /* JSDOMConvertBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMConvertBase.h; sourceTree = "<group>"; }; … … 17059 17062 isa = PBXGroup; 17060 17063 children = ( 17064 52914C2C22F93E5D00578150 /* WHLSLAddressEscapeMode.h */, 17061 17065 1C840B9021EC30F900D0500D /* WHLSLAddressSpace.h */, 17062 52914C2C22F93E5D00578150 /* WHLSLAddressEscapeMode.h */,17063 17066 C21BF72521CD89E200227979 /* WHLSLArrayReferenceType.h */, 17064 17067 C21BF70921CD89CA00227979 /* WHLSLArrayType.h */, … … 17138 17141 C20F4F6421DFBE5C0070C45A /* WHLSLTypeReference.cpp */, 17139 17142 C21BF71F21CD89DC00227979 /* WHLSLTypeReference.h */, 17143 7C85B20122FB04850030684F /* WHLSLUnnamedType.cpp */, 17140 17144 1C33277221CF0D2E000DC9F2 /* WHLSLUnnamedType.h */, 17145 7C85B20422FB06320030684F /* WHLSLUnnamedTypeHash.h */, 17141 17146 C20F4F6721DFF3A70070C45A /* WHLSLUnsignedIntegerLiteral.cpp */, 17142 17147 C21BF72B21CD89E800227979 /* WHLSLUnsignedIntegerLiteral.h */, … … 33516 33521 5D21A80213ECE5DF00BB7064 /* WebVTTParser.cpp in Sources */, 33517 33522 B10B6981140C174000BC1C26 /* WebVTTTokenizer.cpp in Sources */, 33523 7C85B20222FB04850030684F /* WHLSLUnnamedType.cpp in Sources */, 33518 33524 A14832C2187F65C700DA63A6 /* WKUtilities.c in Sources */, 33519 33525 A833C7CC0A2CF07400D57664 /* XLinkNames.cpp in Sources */,
Note: See TracChangeset
for help on using the changeset viewer.