Mangled WHLSL names don't need to allocate Strings
[WebKit-https.git] / Source / WebCore / Modules / webgpu / WHLSL / Metal / WHLSLTypeNamer.h
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(WEBGPU)
29
30 #include "WHLSLMangledNames.h"
31 #include "WHLSLVisitor.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/text/WTFString.h>
34
35 namespace WebCore {
36
37 namespace WHLSL {
38
39 namespace AST {
40
41 class EnumerationDefinition;
42 class EnumerationMember;
43 class NamedType;
44 class NativeTypeDeclaration;
45 class StructureDefinition;
46 class TypeDefinition;
47 class UnnamedType;
48
49 }
50
51 class Program;
52
53 namespace Metal {
54
55 class BaseTypeNameNode;
56
57 class TypeNamer : private Visitor {
58 public:
59     TypeNamer(Program&);
60     virtual ~TypeNamer();
61
62     String metalTypes();
63
64     // Must be called after calling metalTypes().
65     String mangledNameForType(AST::NativeTypeDeclaration&);
66     MangledTypeName mangledNameForType(AST::UnnamedType&);
67     MangledOrNativeTypeName mangledNameForType(AST::NamedType&);
68     MangledEnumerationMemberName mangledNameForEnumerationMember(AST::EnumerationMember&);
69     MangledStructureElementName mangledNameForStructureElement(AST::StructureElement&);
70
71     MangledTypeName generateNextTypeName() { return { m_typeCount++ }; }
72     MangledStructureElementName generateNextStructureElementName() { return { m_structureElementCount++ }; }
73
74 private:
75     void visit(AST::UnnamedType&) override;
76     void visit(AST::EnumerationDefinition&) override;
77     void visit(AST::NativeTypeDeclaration&) override;
78     void visit(AST::StructureDefinition&) override;
79     void visit(AST::TypeDefinition&) override;
80     void visit(AST::Expression&) override;
81     void visit(AST::CallExpression&) override;
82
83     MangledEnumerationMemberName generateNextEnumerationMemberName() { return { m_enumerationMemberCount++ }; }
84
85     void emitNamedTypeDefinition(AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
86     void emitUnnamedTypeDefinition(BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
87     void emitAllUnnamedTypeDefinitions(Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
88     String metalTypeDeclarations();
89     String metalTypeDefinitions();
90
91     UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent);
92     BaseTypeNameNode* insert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&);
93
94     Program& m_program;
95     Vector<UniqueRef<BaseTypeNameNode>> m_trie;
96     HashMap<AST::UnnamedType*, BaseTypeNameNode*> m_unnamedTypeMapping;
97     HashMap<AST::NamedType*, MangledTypeName> m_namedTypeMapping;
98     HashMap<AST::NamedType*, Vector<std::reference_wrapper<BaseTypeNameNode>>> m_dependencyGraph;
99     HashMap<AST::EnumerationMember*, MangledEnumerationMemberName> m_enumerationMemberMapping;
100     HashMap<AST::StructureElement*, MangledStructureElementName> m_structureElementMapping;
101     unsigned m_typeCount { 0 };
102     unsigned m_enumerationMemberCount { 0 };
103     unsigned m_structureElementCount { 0 };
104 };
105
106 } // namespace Metal
107
108 } // namespace WHLSL
109
110 } // namespace WebCore
111
112 #endif