Title: [248266] trunk/Source/WebCore
Revision
248266
Author
wei...@apple.com
Date
2019-08-04 20:26:33 -0700 (Sun, 04 Aug 2019)

Log Message

Mangled WHLSL names don't need to allocate Strings
https://bugs.webkit.org/show_bug.cgi?id=200429

Reviewed by Saam Barati.

To avoid allocating strings for each mangled name used to transform WHLSL to Metal, which we'd
like to avoid since it is both unnecessarily expensive in time and space, we can instead just
store the unique integer identifier that was being used to construct the String.

Since the existing mangled names were all of the form "prefix" + unsigned integer value (where
prefix could be "type", "enumerationMember", "structureElement", "variable" or "function") we
strongly type the integer by storing it in a struct (MangledVariableName, MangledTypeName, etc.)
When the full name is actually needed, StringTypeAdapter's specialized for the structs are
used to write directly into the preallocated buffers of StringBuilders or makeString().

* Modules/webgpu/WHLSL/Metal/WHLSLMangledNames.h: Added.
(WebCore::WHLSL::Metal::MangledVariableName):
(WebCore::WHLSL::Metal::MangledTypeName):
(WebCore::WHLSL::Metal::MangledStructureElementName):
(WebCore::WHLSL::Metal::MangledEnumerationMemberName):
(WebCore::WHLSL::Metal::MangledFunctionName):
Adds structs for each type of mangled name and StringTypeAdapter specializations for
each to allow their use in StringBuilder.flexibleAppend() or makeString().

Additionally, a Variant, MangledOrNativeTypeName, of MangledTypeName and String is
declared to allow for the few cases where a native type (e.g. float4) is needed. The
StringTypeAdapter for MangledOrNativeTypeName could be generalized for any Variant
in the future, but I left it non-general for now, as it is non-obvious if one would
want to store Variant<Types...>, and have each member function construct a temporary
StringTypeAdapter, or store a Variant<StringTypeAdapter<Types>...> and perform conversion
in the construction.

* Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp:
(WebCore::WHLSL::Metal::EntryPointScaffolding::EntryPointScaffolding):
(WebCore::WHLSL::Metal::internalTypeForSemantic):
(WebCore::WHLSL::Metal::EntryPointScaffolding::builtInsSignature):
(WebCore::WHLSL::Metal::EntryPointScaffolding::mangledInputPath):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::VertexEntryPointScaffolding):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::signature):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::pack):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::FragmentEntryPointScaffolding):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::signature):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::pack):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::ComputeEntryPointScaffolding):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::signature):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::pack):
* Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h:
(WebCore::WHLSL::Metal::EntryPointScaffolding::parameterVariables):
* Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:
(WebCore::WHLSL::Metal::FunctionDeclarationWriter::FunctionDeclarationWriter):
(WebCore::WHLSL::Metal::FunctionDeclarationWriter::visit):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::FunctionDefinitionWriter):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::generateNextVariableName):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendRightValueWithNullability):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendRightValue):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendLeftValue):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastValue):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastValueAndNullability):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastLeftValue):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::emitLoop):
(WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::RenderFunctionDefinitionWriter):
(WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::createEntryPointScaffolding):
(WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::ComputeFunctionDefinitionWriter):
(WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::createEntryPointScaffolding):
(WebCore::WHLSL::Metal::sharedMetalFunctions):
* Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h:
* Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h:
* Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:
(WebCore::WHLSL::Metal::writeNativeFunction):
* Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.h:
* Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp:
(WebCore::WHLSL::Metal::BaseTypeNameNode::BaseTypeNameNode):
(WebCore::WHLSL::Metal::BaseTypeNameNode::mangledName const):
(WebCore::WHLSL::Metal::ArrayTypeNameNode::ArrayTypeNameNode):
(WebCore::WHLSL::Metal::ArrayReferenceTypeNameNode::ArrayReferenceTypeNameNode):
(WebCore::WHLSL::Metal::PointerTypeNameNode::PointerTypeNameNode):
(WebCore::WHLSL::Metal::ReferenceTypeNameNode::ReferenceTypeNameNode):
(WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::MetalTypeDeclarationWriter):
(WebCore::WHLSL::Metal::TypeNamer::metalTypeDeclarations):
(WebCore::WHLSL::Metal::TypeNamer::emitNamedTypeDefinition):
(WebCore::WHLSL::Metal::TypeNamer::mangledNameForType):
(WebCore::WHLSL::Metal::TypeNamer::mangledNameForEnumerationMember):
(WebCore::WHLSL::Metal::TypeNamer::mangledNameForStructureElement):
* Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h:
(WebCore::WHLSL::Metal::TypeNamer::generateNextTypeName):
(WebCore::WHLSL::Metal::TypeNamer::generateNextStructureElementName):
(WebCore::WHLSL::Metal::TypeNamer::generateNextEnumerationMemberName):
* Modules/webgpu/WHLSL/WHLSLPrepare.h:
Replace uses of String with the appropriate mangled name type.

* WebCore.xcodeproj/project.pbxproj:
Add WHLSLMangledNames.h

* platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm:
(WebCore::trySetFunctions):
* platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm:
(WebCore::trySetFunctions):
Convert the mangled names to Strings for passing to Metal API. NOTE: We could avoid having the
toString() member function on MangledFunctionName if we allowed makeString() to take a single
argument.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (248265 => 248266)


--- trunk/Source/WebCore/ChangeLog	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/ChangeLog	2019-08-05 03:26:33 UTC (rev 248266)
@@ -1,3 +1,107 @@
+2019-08-04  Sam Weinig  <wei...@apple.com>
+
+        Mangled WHLSL names don't need to allocate Strings
+        https://bugs.webkit.org/show_bug.cgi?id=200429
+
+        Reviewed by Saam Barati.
+
+        To avoid allocating strings for each mangled name used to transform WHLSL to Metal, which we'd
+        like to avoid since it is both unnecessarily expensive in time and space, we can instead just
+        store the unique integer identifier that was being used to construct the String. 
+        
+        Since the existing mangled names were all of the form "prefix" + unsigned integer value (where 
+        prefix could be "type", "enumerationMember", "structureElement", "variable" or "function") we
+        strongly type the integer by storing it in a struct (MangledVariableName, MangledTypeName, etc.)
+        When the full name is actually needed, StringTypeAdapter's specialized for the structs are
+        used to write directly into the preallocated buffers of StringBuilders or makeString().
+
+        * Modules/webgpu/WHLSL/Metal/WHLSLMangledNames.h: Added.
+        (WebCore::WHLSL::Metal::MangledVariableName):
+        (WebCore::WHLSL::Metal::MangledTypeName):
+        (WebCore::WHLSL::Metal::MangledStructureElementName):
+        (WebCore::WHLSL::Metal::MangledEnumerationMemberName):
+        (WebCore::WHLSL::Metal::MangledFunctionName):
+        Adds structs for each type of mangled name and StringTypeAdapter specializations for
+        each to allow their use in StringBuilder.flexibleAppend() or makeString(). 
+        
+        Additionally, a Variant, MangledOrNativeTypeName, of MangledTypeName and String is 
+        declared to allow for the few cases where a native type (e.g. float4) is needed. The
+        StringTypeAdapter for MangledOrNativeTypeName could be generalized for any Variant
+        in the future, but I left it non-general for now, as it is non-obvious if one would
+        want to store Variant<Types...>, and have each member function construct a temporary
+        StringTypeAdapter, or store a Variant<StringTypeAdapter<Types>...> and perform conversion
+        in the construction.
+
+        * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp:
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::EntryPointScaffolding):
+        (WebCore::WHLSL::Metal::internalTypeForSemantic):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::builtInsSignature):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::mangledInputPath):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::VertexEntryPointScaffolding):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::signature):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::pack):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::FragmentEntryPointScaffolding):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::signature):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::pack):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::ComputeEntryPointScaffolding):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::signature):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::pack):
+        * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h:
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::parameterVariables):
+        * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:
+        (WebCore::WHLSL::Metal::FunctionDeclarationWriter::FunctionDeclarationWriter):
+        (WebCore::WHLSL::Metal::FunctionDeclarationWriter::visit):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::FunctionDefinitionWriter):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::generateNextVariableName):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendRightValueWithNullability):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendRightValue):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::appendLeftValue):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastValue):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastValueAndNullability):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::takeLastLeftValue):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::emitLoop):
+        (WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::RenderFunctionDefinitionWriter):
+        (WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::createEntryPointScaffolding):
+        (WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::ComputeFunctionDefinitionWriter):
+        (WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::createEntryPointScaffolding):
+        (WebCore::WHLSL::Metal::sharedMetalFunctions):
+        * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h:
+        * Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h:
+        * Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:
+        (WebCore::WHLSL::Metal::writeNativeFunction):
+        * Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.h:
+        * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp:
+        (WebCore::WHLSL::Metal::BaseTypeNameNode::BaseTypeNameNode):
+        (WebCore::WHLSL::Metal::BaseTypeNameNode::mangledName const):
+        (WebCore::WHLSL::Metal::ArrayTypeNameNode::ArrayTypeNameNode):
+        (WebCore::WHLSL::Metal::ArrayReferenceTypeNameNode::ArrayReferenceTypeNameNode):
+        (WebCore::WHLSL::Metal::PointerTypeNameNode::PointerTypeNameNode):
+        (WebCore::WHLSL::Metal::ReferenceTypeNameNode::ReferenceTypeNameNode):
+        (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::MetalTypeDeclarationWriter):
+        (WebCore::WHLSL::Metal::TypeNamer::metalTypeDeclarations):
+        (WebCore::WHLSL::Metal::TypeNamer::emitNamedTypeDefinition):
+        (WebCore::WHLSL::Metal::TypeNamer::mangledNameForType):
+        (WebCore::WHLSL::Metal::TypeNamer::mangledNameForEnumerationMember):
+        (WebCore::WHLSL::Metal::TypeNamer::mangledNameForStructureElement):
+        * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h:
+        (WebCore::WHLSL::Metal::TypeNamer::generateNextTypeName):
+        (WebCore::WHLSL::Metal::TypeNamer::generateNextStructureElementName):
+        (WebCore::WHLSL::Metal::TypeNamer::generateNextEnumerationMemberName):
+        * Modules/webgpu/WHLSL/WHLSLPrepare.h:
+        Replace uses of String with the appropriate mangled name type.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Add WHLSLMangledNames.h
+
+        * platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm:
+        (WebCore::trySetFunctions):
+        * platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm:
+        (WebCore::trySetFunctions):
+        Convert the mangled names to Strings for passing to Metal API. NOTE: We could avoid having the
+        toString() member function on MangledFunctionName if we allowed makeString() to take a single
+        argument.
+
 2019-08-04  Chris Dumez  <cdu...@apple.com>
 
         Ping loads should not prevent page caching

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp	2019-08-05 03:26:33 UTC (rev 248266)
@@ -91,7 +91,7 @@
     return makeString("[[user(user", stageInOutSemantic.index(), ")]]");
 }
 
-EntryPointScaffolding::EntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<String()>&& generateNextVariableName)
+EntryPointScaffolding::EntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName)
     : m_functionDefinition(functionDefinition)
     , m_intrinsics(intrinsics)
     , m_typeNamer(typeNamer)
@@ -192,38 +192,38 @@
     return stringBuilder.toString();
 }
 
-static String internalTypeForSemantic(const AST::BuiltInSemantic& builtInSemantic)
+static StringView internalTypeForSemantic(const AST::BuiltInSemantic& builtInSemantic)
 {
     switch (builtInSemantic.variable()) {
     case AST::BuiltInSemantic::Variable::SVInstanceID:
-        return "uint"_str;
+        return "uint";
     case AST::BuiltInSemantic::Variable::SVVertexID:
-        return "uint"_str;
+        return "uint";
     case AST::BuiltInSemantic::Variable::PSize:
-        return "float"_str;
+        return "float";
     case AST::BuiltInSemantic::Variable::SVPosition:
-        return "float4"_str;
+        return "float4";
     case AST::BuiltInSemantic::Variable::SVIsFrontFace:
-        return "bool"_str;
+        return "bool";
     case AST::BuiltInSemantic::Variable::SVSampleIndex:
-        return "uint"_str;
+        return "uint";
     case AST::BuiltInSemantic::Variable::SVInnerCoverage:
-        return "uint"_str;
+        return "uint";
     case AST::BuiltInSemantic::Variable::SVTarget:
-        return String();
+        return { };
     case AST::BuiltInSemantic::Variable::SVDepth:
-        return "float"_str;
+        return "float";
     case AST::BuiltInSemantic::Variable::SVCoverage:
-        return "uint"_str;
+        return "uint";
     case AST::BuiltInSemantic::Variable::SVDispatchThreadID:
-        return "uint3"_str;
+        return "uint3";
     case AST::BuiltInSemantic::Variable::SVGroupID:
-        return "uint3"_str;
+        return "uint3";
     case AST::BuiltInSemantic::Variable::SVGroupIndex:
-        return "uint"_str;
+        return "uint";
     default:
         ASSERT(builtInSemantic.variable() == AST::BuiltInSemantic::Variable::SVGroupThreadID);
-        return "uint3"_str;
+        return "uint3";
     }
 }
 
@@ -240,10 +240,11 @@
         auto& item = m_entryPointItems.inputs[namedBuiltIn.indexInEntryPointItems];
         auto& builtInSemantic = WTF::get<AST::BuiltInSemantic>(*item.semantic);
         auto internalType = internalTypeForSemantic(builtInSemantic);
-        if (internalType.isNull())
-            internalType = m_typeNamer.mangledNameForType(*item.unnamedType);
-        auto variableName = namedBuiltIn.variableName;
-        stringBuilder.flexibleAppend(internalType, ' ', variableName, ' ', attributeForSemantic(builtInSemantic));
+        if (!internalType.isNull())
+            stringBuilder.flexibleAppend(internalType);
+        else
+            stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*item.unnamedType));
+        stringBuilder.flexibleAppend(' ', namedBuiltIn.variableName, ' ', attributeForSemantic(builtInSemantic));
     }
     return stringBuilder.toString();
 }
@@ -256,7 +257,7 @@
     AST::StructureDefinition* structureDefinition = nullptr;
     for (size_t i = 0; i < m_functionDefinition.parameters().size(); ++i) {
         if (m_functionDefinition.parameters()[i]->name() == path[0]) {
-            stringBuilder.append(m_parameterVariables[i]);
+            stringBuilder.flexibleAppend(m_parameterVariables[i]);
             auto& unifyNode = m_functionDefinition.parameters()[i]->type()->unifyNode();
             if (is<AST::NamedType>(unifyNode)) {
                 auto& namedType = downcast<AST::NamedType>(unifyNode);
@@ -356,7 +357,7 @@
     return stringBuilder.toString();
 }
 
-VertexEntryPointScaffolding::VertexEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<String()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes)
+VertexEntryPointScaffolding::VertexEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes)
     : EntryPointScaffolding(functionDefinition, intrinsics, typeNamer, entryPointItems, resourceMap, layout, WTFMove(generateNextVariableName))
     , m_matchedVertexAttributes(matchedVertexAttributes)
     , m_stageInStructName(typeNamer.generateNextTypeName())
@@ -377,9 +378,12 @@
         auto& outputItem = m_entryPointItems.outputs[i];
         NamedOutput namedOutput;
         namedOutput.elementName = m_typeNamer.generateNextStructureElementName();
+        StringView internalType;
         if (WTF::holds_alternative<AST::BuiltInSemantic>(*outputItem.semantic))
-            namedOutput.internalTypeName = internalTypeForSemantic(WTF::get<AST::BuiltInSemantic>(*outputItem.semantic));
-        if (namedOutput.internalTypeName.isNull())
+            internalType = internalTypeForSemantic(WTF::get<AST::BuiltInSemantic>(*outputItem.semantic));
+        if (!internalType.isNull())
+            namedOutput.internalTypeName = internalType.toString();
+        else
             namedOutput.internalTypeName = m_typeNamer.mangledNameForType(*outputItem.unnamedType);
         m_namedOutputs.uncheckedAppend(WTFMove(namedOutput));
     }
@@ -415,7 +419,7 @@
     return stringBuilder.toString();
 }
 
-String VertexEntryPointScaffolding::signature(String& functionName)
+String VertexEntryPointScaffolding::signature(MangledFunctionName functionName)
 {
     StringBuilder stringBuilder;
 
@@ -444,7 +448,7 @@
     return stringBuilder.toString();
 }
 
-String VertexEntryPointScaffolding::pack(const String& inputVariableName, const String& outputVariableName)
+String VertexEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName)
 {
     StringBuilder stringBuilder;
 
@@ -463,7 +467,7 @@
     return stringBuilder.toString();
 }
 
-FragmentEntryPointScaffolding::FragmentEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<String()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>&)
+FragmentEntryPointScaffolding::FragmentEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>&)
     : EntryPointScaffolding(functionDefinition, intrinsics, typeNamer, entryPointItems, resourceMap, layout, WTFMove(generateNextVariableName))
     , m_stageInStructName(typeNamer.generateNextTypeName())
     , m_returnStructName(typeNamer.generateNextTypeName())
@@ -486,9 +490,12 @@
         auto& outputItem = m_entryPointItems.outputs[i];
         NamedOutput namedOutput;
         namedOutput.elementName = m_typeNamer.generateNextStructureElementName();
+        StringView internalType;
         if (WTF::holds_alternative<AST::BuiltInSemantic>(*outputItem.semantic))
-            namedOutput.internalTypeName = internalTypeForSemantic(WTF::get<AST::BuiltInSemantic>(*outputItem.semantic));
-        if (namedOutput.internalTypeName.isNull())
+            internalType = internalTypeForSemantic(WTF::get<AST::BuiltInSemantic>(*outputItem.semantic));
+        if (!internalType.isNull())
+            namedOutput.internalTypeName = internalType.toString();
+        else
             namedOutput.internalTypeName = m_typeNamer.mangledNameForType(*outputItem.unnamedType);
         m_namedOutputs.uncheckedAppend(WTFMove(namedOutput));
     }
@@ -524,7 +531,7 @@
     return stringBuilder.toString();
 }
 
-String FragmentEntryPointScaffolding::signature(String& functionName)
+String FragmentEntryPointScaffolding::signature(MangledFunctionName functionName)
 {
     StringBuilder stringBuilder;
 
@@ -553,7 +560,7 @@
     return stringBuilder.toString();
 }
 
-String FragmentEntryPointScaffolding::pack(const String& inputVariableName, const String& outputVariableName)
+String FragmentEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName)
 {
     StringBuilder stringBuilder;
 
@@ -572,7 +579,7 @@
     return stringBuilder.toString();
 }
 
-ComputeEntryPointScaffolding::ComputeEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<String()>&& generateNextVariableName)
+ComputeEntryPointScaffolding::ComputeEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName)
     : EntryPointScaffolding(functionDefinition, intrinsics, typeNamer, entryPointItems, resourceMap, layout, WTFMove(generateNextVariableName))
 {
 }
@@ -582,7 +589,7 @@
     return resourceHelperTypes();
 }
 
-String ComputeEntryPointScaffolding::signature(String& functionName)
+String ComputeEntryPointScaffolding::signature(MangledFunctionName functionName)
 {
     StringBuilder stringBuilder;
 
@@ -607,7 +614,7 @@
     return unpackResourcesAndNamedBuiltIns();
 }
 
-String ComputeEntryPointScaffolding::pack(const String&, const String&)
+String ComputeEntryPointScaffolding::pack(MangledVariableName, MangledVariableName)
 {
     ASSERT_NOT_REACHED();
     return String();

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -27,6 +27,7 @@
 
 #if ENABLE(WEBGPU)
 
+#include "WHLSLMangledNames.h"
 #include "WHLSLPipelineDescriptor.h"
 #include <wtf/HashMap.h>
 #include <wtf/text/WTFString.h>
@@ -50,17 +51,18 @@
 
 class EntryPointScaffolding {
 public:
-    EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<String()>&& generateNextVariableName);
     virtual ~EntryPointScaffolding() = default;
 
     virtual String helperTypes() = 0;
-    virtual String signature(String& functionName) = 0;
+    virtual String signature(MangledFunctionName) = 0;
     virtual String unpack() = 0;
-    virtual String pack(const String& existingVariableName, const String& variableName) = 0;
+    virtual String pack(MangledVariableName existingVariableName, MangledVariableName) = 0;
 
-    Vector<String>& parameterVariables() { return m_parameterVariables; }
+    Vector<MangledVariableName>& parameterVariables() { return m_parameterVariables; }
 
 protected:
+    EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
+
     String resourceHelperTypes();
     Optional<String> resourceSignature();
     Optional<String> builtInsSignature();
@@ -75,21 +77,21 @@
     EntryPointItems& m_entryPointItems;
     HashMap<Binding*, size_t>& m_resourceMap;
     Layout& m_layout;
-    std::function<String()> m_generateNextVariableName;
+    std::function<MangledVariableName()> m_generateNextVariableName;
 
     struct LengthInformation {
-        String elementName;
-        String temporaryName;
+        MangledStructureElementName elementName;
+        MangledVariableName temporaryName;
         unsigned index;
     };
     struct NamedBinding {
-        String elementName;
+        MangledStructureElementName elementName;
         unsigned index;
         Optional<LengthInformation> lengthInformation;
     };
     struct NamedBindGroup {
-        String structName;
-        String variableName;
+        MangledTypeName structName;
+        MangledVariableName variableName;
         Vector<NamedBinding> namedBindings;
         unsigned argumentBufferIndex;
     };
@@ -97,39 +99,39 @@
 
     struct NamedBuiltIn {
         size_t indexInEntryPointItems;
-        String variableName;
+        MangledVariableName variableName;
     };
     Vector<NamedBuiltIn> m_namedBuiltIns;
 
-    Vector<String> m_parameterVariables;
+    Vector<MangledVariableName> m_parameterVariables;
 };
 
 class VertexEntryPointScaffolding : public EntryPointScaffolding {
 public:
-    VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<String()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes);
+    VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes);
     virtual ~VertexEntryPointScaffolding() = default;
 
     String helperTypes() override;
-    String signature(String& functionName) override;
+    String signature(MangledFunctionName) override;
     String unpack() override;
-    String pack(const String& existingVariableName, const String& variableName) override;
+    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
 
 private:
     HashMap<VertexAttribute*, size_t>& m_matchedVertexAttributes;
-    String m_stageInStructName;
-    String m_returnStructName;
-    String m_stageInParameterName;
+    MangledTypeName m_stageInStructName;
+    MangledTypeName m_returnStructName;
+    MangledVariableName m_stageInParameterName;
 
     struct NamedStageIn {
         size_t indexInEntryPointItems;
-        String elementName;
+        MangledStructureElementName elementName;
         unsigned attributeIndex;
     };
     Vector<NamedStageIn> m_namedStageIns;
 
     struct NamedOutput {
-        String elementName;
-        String internalTypeName;
+        MangledStructureElementName elementName;
+        MangledOrNativeTypeName internalTypeName;
     };
     Vector<NamedOutput> m_namedOutputs;
 };
@@ -136,29 +138,29 @@
 
 class FragmentEntryPointScaffolding : public EntryPointScaffolding {
 public:
-    FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<String()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments);
+    FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments);
     virtual ~FragmentEntryPointScaffolding() = default;
 
     String helperTypes() override;
-    String signature(String& functionName) override;
+    String signature(MangledFunctionName) override;
     String unpack() override;
-    String pack(const String& existingVariableName, const String& variableName) override;
+    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
 
 private:
-    String m_stageInStructName;
-    String m_returnStructName;
-    String m_stageInParameterName;
+    MangledTypeName m_stageInStructName;
+    MangledTypeName m_returnStructName;
+    MangledVariableName m_stageInParameterName;
 
     struct NamedStageIn {
         size_t indexInEntryPointItems;
-        String elementName;
+        MangledStructureElementName elementName;
         unsigned attributeIndex;
     };
     Vector<NamedStageIn> m_namedStageIns;
 
     struct NamedOutput {
-        String elementName;
-        String internalTypeName;
+        MangledStructureElementName elementName;
+        MangledOrNativeTypeName internalTypeName;
     };
     Vector<NamedOutput> m_namedOutputs;
 };
@@ -165,15 +167,13 @@
 
 class ComputeEntryPointScaffolding : public EntryPointScaffolding {
 public:
-    ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<String()>&& generateNextVariableName);
+    ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
     virtual ~ComputeEntryPointScaffolding() = default;
 
     String helperTypes() override;
-    String signature(String& functionName) override;
+    String signature(MangledFunctionName) override;
     String unpack() override;
-    String pack(const String& existingVariableName, const String& variableName) override;
-
-private:
+    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
 };
 
 }

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-05 03:26:33 UTC (rev 248266)
@@ -49,7 +49,7 @@
 
 class FunctionDeclarationWriter : public Visitor {
 public:
-    FunctionDeclarationWriter(TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, String>& functionMapping)
+    FunctionDeclarationWriter(TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping)
         : m_typeNamer(typeNamer)
         , m_functionMapping(functionMapping)
     {
@@ -63,7 +63,7 @@
 
 private:
     TypeNamer& m_typeNamer;
-    HashMap<AST::FunctionDeclaration*, String>& m_functionMapping;
+    HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping;
     StringBuilder m_stringBuilder;
 };
 
@@ -78,7 +78,7 @@
     for (size_t i = 0; i < functionDeclaration.parameters().size(); ++i) {
         if (i)
             m_stringBuilder.append(", ");
-        m_stringBuilder.append(m_typeNamer.mangledNameForType(*functionDeclaration.parameters()[i]->type()));
+        m_stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*functionDeclaration.parameters()[i]->type()));
     }
     m_stringBuilder.append(");\n");
 }
@@ -85,7 +85,7 @@
 
 class FunctionDefinitionWriter : public Visitor {
 public:
-    FunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, String>& functionMapping, Layout& layout)
+    FunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, Layout& layout)
         : m_intrinsics(intrinsics)
         , m_typeNamer(typeNamer)
         , m_functionMapping(functionMapping)
@@ -150,10 +150,7 @@
 
     String constantExpressionString(AST::ConstantExpression&);
 
-    String generateNextVariableName()
-    {
-        return makeString("variable", m_variableCount++);
-    }
+    MangledVariableName generateNextVariableName() { return { m_variableCount++ }; }
 
     enum class Nullability : uint8_t {
         NotNull,
@@ -161,14 +158,14 @@
     };
 
     struct StackItem {
-        String value;
-        String leftValue;
+        MangledVariableName value;
+        Optional<MangledVariableName> leftValue;
         Nullability valueNullability;
         Nullability leftValueNullability;
     };
 
     struct StackValue {
-        String value;
+        MangledVariableName value;
         Nullability nullability;
     };
 
@@ -177,31 +174,29 @@
     // and DereferenceExpression. MakePointerExpression will try to produce rvalues which are
     // non-null, and DereferenceExpression will take a non-null rvalue and try to produce
     // a non-null lvalue.
-    void appendRightValueWithNullability(AST::_expression_&, String value, Nullability nullability)
+    void appendRightValueWithNullability(AST::_expression_&, MangledVariableName value, Nullability nullability)
     {
-        m_stack.append({ WTFMove(value), String(), nullability, Nullability::CanBeNull });
+        m_stack.append({ WTFMove(value), WTF::nullopt, nullability, Nullability::CanBeNull });
     }
 
-    void appendRightValue(AST::_expression_& _expression_, String value)
+    void appendRightValue(AST::_expression_& _expression_, MangledVariableName value)
     {
         appendRightValueWithNullability(_expression_, WTFMove(value), Nullability::CanBeNull);
     }
 
-    void appendLeftValue(AST::_expression_& _expression_, String value, String leftValue, Nullability nullability)
+    void appendLeftValue(AST::_expression_& _expression_, MangledVariableName value, MangledVariableName leftValue, Nullability nullability)
     {
         ASSERT_UNUSED(_expression_, _expression_.typeAnnotation().leftAddressSpace());
         m_stack.append({ WTFMove(value), WTFMove(leftValue), Nullability::CanBeNull, nullability });
     }
 
-    String takeLastValue()
+    MangledVariableName takeLastValue()
     {
-        ASSERT(m_stack.last().value);
         return m_stack.takeLast().value;
     }
 
     StackValue takeLastValueAndNullability()
     {
-        ASSERT(m_stack.last().value);
         auto last = m_stack.takeLast();
         return { last.value, last.valueNullability };
     }
@@ -210,7 +205,7 @@
     {
         ASSERT(m_stack.last().leftValue);
         auto last = m_stack.takeLast();
-        return { last.leftValue, last.leftValueNullability };
+        return { *last.leftValue, last.leftValueNullability };
     }
 
     enum class BreakContext {
@@ -222,8 +217,8 @@
 
     Intrinsics& m_intrinsics;
     TypeNamer& m_typeNamer;
-    HashMap<AST::FunctionDeclaration*, String>& m_functionMapping;
-    HashMap<AST::VariableDeclaration*, String> m_variableMapping;
+    HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping;
+    HashMap<AST::VariableDeclaration*, MangledVariableName> m_variableMapping;
     StringBuilder m_stringBuilder;
 
     Vector<StackItem> m_stack;
@@ -230,7 +225,7 @@
     std::unique_ptr<EntryPointScaffolding> m_entryPointScaffolding;
     Layout& m_layout;
     unsigned m_variableCount { 0 };
-    String m_breakOutOfCurrentLoopEarlyVariable;
+    Optional<MangledVariableName> m_breakOutOfCurrentLoopEarlyVariable;
 };
 
 void FunctionDefinitionWriter::visit(AST::NativeFunctionDeclaration& nativeFunctionDeclaration)
@@ -307,9 +302,9 @@
         m_stringBuilder.append("break;\n");
         break;
     case BreakContext::Loop:
-        ASSERT(m_breakOutOfCurrentLoopEarlyVariable.length());
+        ASSERT(m_breakOutOfCurrentLoopEarlyVariable);
         m_stringBuilder.flexibleAppend(
-            m_breakOutOfCurrentLoopEarlyVariable, " = true;\n"
+            *m_breakOutOfCurrentLoopEarlyVariable, " = true;\n"
             "break;\n"
         );
         break;
@@ -318,7 +313,7 @@
 
 void FunctionDefinitionWriter::visit(AST::Continue&)
 {
-    ASSERT(m_breakOutOfCurrentLoopEarlyVariable.length());
+    ASSERT(m_breakOutOfCurrentLoopEarlyVariable);
     m_stringBuilder.append("break;\n");
 }
 
@@ -335,10 +330,10 @@
 
 void FunctionDefinitionWriter::emitLoop(LoopConditionLocation loopConditionLocation, AST::_expression_* conditionExpression, AST::_expression_* increment, AST::Statement& body)
 {
-    SetForScope<String> loopVariableScope(m_breakOutOfCurrentLoopEarlyVariable, generateNextVariableName());
+    SetForScope<Optional<MangledVariableName>> loopVariableScope(m_breakOutOfCurrentLoopEarlyVariable, generateNextVariableName());
 
     m_stringBuilder.flexibleAppend(
-        "bool ", m_breakOutOfCurrentLoopEarlyVariable, " = false;\n",
+        "bool ", *m_breakOutOfCurrentLoopEarlyVariable, " = false;\n",
         "while (true) {\n"
     );
 
@@ -352,7 +347,7 @@
     checkErrorAndVisit(body);
     m_stringBuilder.flexibleAppend(
         "} while(false); \n"
-        "if (", m_breakOutOfCurrentLoopEarlyVariable, ") break;\n"
+        "if (", *m_breakOutOfCurrentLoopEarlyVariable, ") break;\n"
     );
 
     if (increment) {
@@ -516,7 +511,7 @@
     // This should be lowered already.
     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195788 Replace this with ASSERT_NOT_REACHED().
     notImplemented();
-    appendRightValue(dotExpression, "dummy");
+    appendRightValue(dotExpression, generateNextVariableName());
 }
 
 void FunctionDefinitionWriter::visit(AST::GlobalVariableReference& globalVariableReference)
@@ -537,7 +532,7 @@
     // This should be lowered already.
     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195788 Replace this with ASSERT_NOT_REACHED().
     notImplemented();
-    appendRightValue(indexExpression, "dummy");
+    appendRightValue(indexExpression, generateNextVariableName());
 }
 
 void FunctionDefinitionWriter::visit(AST::PropertyAccessExpression& propertyAccessExpression)
@@ -545,7 +540,7 @@
     // This should be lowered already.
     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195788 Replace this with ASSERT_NOT_REACHED().
     notImplemented();
-    appendRightValue(propertyAccessExpression, "dummy");
+    appendRightValue(propertyAccessExpression, generateNextVariableName());
 }
 
 void FunctionDefinitionWriter::visit(AST::VariableDeclaration& variableDeclaration)
@@ -577,7 +572,7 @@
 
 void FunctionDefinitionWriter::visit(AST::CallExpression& callExpression)
 {
-    Vector<String> argumentNames;
+    Vector<MangledVariableName> argumentNames;
     for (auto& argument : callExpression.arguments()) {
         checkErrorAndVisit(argument);
         argumentNames.append(takeLastValue());
@@ -591,7 +586,7 @@
     for (size_t i = 0; i < argumentNames.size(); ++i) {
         if (i)
             m_stringBuilder.append(", ");
-        m_stringBuilder.append(argumentNames[i]);
+        m_stringBuilder.flexibleAppend(argumentNames[i]);
     }
     m_stringBuilder.append(");\n");
     appendRightValue(callExpression, variableName);
@@ -599,12 +594,13 @@
 
 void FunctionDefinitionWriter::visit(AST::CommaExpression& commaExpression)
 {
-    String result;
+    Optional<MangledVariableName> result;
     for (auto& _expression_ : commaExpression.list()) {
         checkErrorAndVisit(_expression_);
         result = takeLastValue();
     }
-    appendRightValue(commaExpression, result);
+    ASSERT(result);
+    appendRightValue(commaExpression, *result);
 }
 
 void FunctionDefinitionWriter::visit(AST::DereferenceExpression& dereferenceExpression)
@@ -750,7 +746,7 @@
 
 class RenderFunctionDefinitionWriter : public FunctionDefinitionWriter {
 public:
-    RenderFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, String>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
+    RenderFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
         : FunctionDefinitionWriter(intrinsics, typeNamer, functionMapping, layout)
         , m_matchedSemantics(WTFMove(matchedSemantics))
     {
@@ -764,7 +760,7 @@
 
 std::unique_ptr<EntryPointScaffolding> RenderFunctionDefinitionWriter::createEntryPointScaffolding(AST::FunctionDefinition& functionDefinition)
 {
-    auto generateNextVariableName = [this]() -> String {
+    auto generateNextVariableName = [this]() -> MangledVariableName {
         return this->generateNextVariableName();
     };
     if (&functionDefinition == m_matchedSemantics.vertexShader)
@@ -776,7 +772,7 @@
 
 class ComputeFunctionDefinitionWriter : public FunctionDefinitionWriter {
 public:
-    ComputeFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, String>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
+    ComputeFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
         : FunctionDefinitionWriter(intrinsics, typeNamer, functionMapping, layout)
         , m_matchedSemantics(WTFMove(matchedSemantics))
     {
@@ -790,7 +786,7 @@
 
 std::unique_ptr<EntryPointScaffolding> ComputeFunctionDefinitionWriter::createEntryPointScaffolding(AST::FunctionDefinition& functionDefinition)
 {
-    auto generateNextVariableName = [this]() -> String {
+    auto generateNextVariableName = [this]() -> MangledVariableName {
         return this->generateNextVariableName();
     };
     if (&functionDefinition == m_matchedSemantics.shader)
@@ -799,7 +795,7 @@
 }
 
 struct SharedMetalFunctionsResult {
-    HashMap<AST::FunctionDeclaration*, String> functionMapping;
+    HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping;
     String metalFunctions;
 };
 static SharedMetalFunctionsResult sharedMetalFunctions(Program& program, TypeNamer& typeNamer, const HashSet<AST::FunctionDeclaration*>& reachableFunctions)
@@ -807,13 +803,13 @@
     StringBuilder stringBuilder;
 
     unsigned numFunctions = 0;
-    HashMap<AST::FunctionDeclaration*, String> functionMapping;
+    HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping;
     for (auto& nativeFunctionDeclaration : program.nativeFunctionDeclarations()) {
-        auto addResult = functionMapping.add(&nativeFunctionDeclaration, makeString("function", numFunctions++));
+        auto addResult = functionMapping.add(&nativeFunctionDeclaration, MangledFunctionName { numFunctions++ });
         ASSERT_UNUSED(addResult, addResult.isNewEntry);
     }
     for (auto& functionDefinition : program.functionDefinitions()) {
-        auto addResult = functionMapping.add(&functionDefinition, makeString("function", numFunctions++));
+        auto addResult = functionMapping.add(&functionDefinition, MangledFunctionName { numFunctions++ });
         ASSERT_UNUSED(addResult, addResult.isNewEntry);
     }
 

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -27,6 +27,7 @@
 
 #if ENABLE(WEBGPU)
 
+#include "WHLSLMangledNames.h"
 #include "WHLSLSemanticMatcher.h"
 
 namespace WebCore {
@@ -41,14 +42,14 @@
 
 struct RenderMetalFunctions {
     String metalSource;
-    String mangledVertexEntryPointName;
-    String mangledFragmentEntryPointName;
+    MangledFunctionName mangledVertexEntryPointName;
+    MangledFunctionName mangledFragmentEntryPointName;
 };
 RenderMetalFunctions metalFunctions(Program&, TypeNamer&, MatchedRenderSemantics&&, Layout&);
 
 struct ComputeMetalFunctions {
     String metalSource;
-    String mangledEntryPointName;
+    MangledFunctionName mangledEntryPointName;
 };
 ComputeMetalFunctions metalFunctions(Program&, TypeNamer&, MatchedComputeSemantics&&, Layout&);
 

Added: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMangledNames.h (0 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMangledNames.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMangledNames.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(WEBGPU)
+
+#include <wtf/Variant.h>
+#include <wtf/text/StringConcatenate.h>
+#include <wtf/text/StringConcatenateNumbers.h>
+
+namespace WebCore {
+
+namespace WHLSL {
+
+namespace Metal {
+
+struct MangledVariableName {
+    unsigned value;
+    static constexpr const char* prefix = "variable";
+};
+
+struct MangledTypeName {
+    unsigned value;
+    static constexpr const char* prefix = "type";
+};
+
+struct MangledStructureElementName {
+    unsigned value;
+    static constexpr const char* prefix = "structureElement";
+};
+
+struct MangledEnumerationMemberName {
+    unsigned value;
+    static constexpr const char* prefix = "enumerationMember";
+};
+
+struct MangledFunctionName {
+    unsigned value;
+    static constexpr const char* prefix = "function";
+
+    String toString() const { return makeString(prefix, value); }
+};
+
+using MangledOrNativeTypeName = Variant<MangledTypeName, String>;
+
+} // namespace Metal
+
+} // namespace WHLSL
+
+} // namespace WebCore
+
+namespace WTF {
+
+template<typename MangledNameType>
+class MangledNameAdaptor {
+public:
+    MangledNameAdaptor(MangledNameType name)
+        : m_name { name }
+    {
+    }
+
+    unsigned length() { return strlen(MangledNameType::prefix) + lengthOfNumberAsStringUnsigned(m_name.value); }
+    bool is8Bit() { return true; }
+    template<typename CharacterType> void writeTo(CharacterType* destination)
+    {
+        StringImpl::copyCharacters(destination, reinterpret_cast<const LChar*>(MangledNameType::prefix), strlen(MangledNameType::prefix));
+        writeNumberToBufferUnsigned(m_name.value, destination + strlen(MangledNameType::prefix));
+    }
+
+private:
+    MangledNameType m_name;
+};
+
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledVariableName, void> : public MangledNameAdaptor<WebCore::WHLSL::Metal::MangledVariableName> {
+public:
+    StringTypeAdapter(WebCore::WHLSL::Metal::MangledVariableName name)
+        : MangledNameAdaptor(name)
+    {
+    }
+};
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledTypeName, void> : public MangledNameAdaptor<WebCore::WHLSL::Metal::MangledTypeName> {
+public:
+    StringTypeAdapter(WebCore::WHLSL::Metal::MangledTypeName name)
+        : MangledNameAdaptor(name)
+    {
+    }
+};
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledStructureElementName, void> : public MangledNameAdaptor<WebCore::WHLSL::Metal::MangledStructureElementName> {
+public:
+    StringTypeAdapter(WebCore::WHLSL::Metal::MangledStructureElementName name)
+        : MangledNameAdaptor(name)
+    {
+    }
+};
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledEnumerationMemberName, void> : public MangledNameAdaptor<WebCore::WHLSL::Metal::MangledEnumerationMemberName> {
+public:
+    StringTypeAdapter(WebCore::WHLSL::Metal::MangledEnumerationMemberName name)
+        : MangledNameAdaptor(name)
+    {
+    }
+};
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledFunctionName, void> : public MangledNameAdaptor<WebCore::WHLSL::Metal::MangledFunctionName> {
+public:
+    StringTypeAdapter(WebCore::WHLSL::Metal::MangledFunctionName name)
+        : MangledNameAdaptor(name)
+    {
+    }
+};
+
+template<> class StringTypeAdapter<WebCore::WHLSL::Metal::MangledOrNativeTypeName, void> {
+public:
+    StringTypeAdapter(const WebCore::WHLSL::Metal::MangledOrNativeTypeName& name)
+        : m_name { name }
+    {
+    }
+
+    unsigned length()
+    {
+        return WTF::switchOn(m_name,
+            [&] (const WebCore::WHLSL::Metal::MangledTypeName& mangledTypeName) {
+                return strlen(WebCore::WHLSL::Metal::MangledTypeName::prefix) + lengthOfNumberAsStringUnsigned(mangledTypeName.value);
+            },
+            [&] (const String& string) {
+                return string.length();
+            }
+        );
+    }
+
+    bool is8Bit()
+    {
+        return WTF::switchOn(m_name,
+            [&] (const WebCore::WHLSL::Metal::MangledTypeName&) {
+                return true;
+            },
+            [&] (const String& string) {
+                return string.is8Bit();
+            }
+        );
+    }
+
+    template<typename CharacterType> void writeTo(CharacterType* destination)
+    {
+        WTF::switchOn(m_name,
+            [&] (const WebCore::WHLSL::Metal::MangledTypeName& mangledTypeName) {
+                StringImpl::copyCharacters(destination, reinterpret_cast<const LChar*>(WebCore::WHLSL::Metal::MangledTypeName::prefix), strlen(WebCore::WHLSL::Metal::MangledTypeName::prefix));
+                writeNumberToBufferUnsigned(mangledTypeName.value, destination + strlen(WebCore::WHLSL::Metal::MangledTypeName::prefix));
+            },
+            [&] (const String& string) {
+                StringView { string }.getCharactersWithUpconvert(destination);
+            }
+        );
+    }
+
+private:
+    const WebCore::WHLSL::Metal::MangledOrNativeTypeName& m_name;
+};
+
+}
+
+#endif

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -27,6 +27,7 @@
 
 #if ENABLE(WEBGPU)
 
+#include "WHLSLMangledNames.h"
 #include "WHLSLPipelineDescriptor.h"
 #include "WHLSLSemanticMatcher.h"
 #include <wtf/Variant.h>
@@ -42,8 +43,8 @@
 
 struct RenderMetalCode {
     String metalSource;
-    String mangledVertexEntryPointName;
-    String mangledFragmentEntryPointName;
+    MangledFunctionName mangledVertexEntryPointName;
+    MangledFunctionName mangledFragmentEntryPointName;
 };
 // Can't fail. Any failure checks need to be done earlier, in the backend-agnostic part of the compiler.
 RenderMetalCode generateMetalCode(Program&, MatchedRenderSemantics&& matchedSemantics, Layout&);
@@ -50,7 +51,7 @@
 
 struct ComputeMetalCode {
     String metalSource;
-    String mangledEntryPointName;
+    MangledFunctionName mangledEntryPointName;
 };
 // Can't fail. Any failure checks need to be done earlier, in the backend-agnostic part of the compiler.
 ComputeMetalCode generateMetalCode(Program&, MatchedComputeSemantics&& matchedSemantics, Layout&);

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp	2019-08-05 03:26:33 UTC (rev 248266)
@@ -120,7 +120,7 @@
     }
 }
 
-String writeNativeFunction(AST::NativeFunctionDeclaration& nativeFunctionDeclaration, String& outputFunctionName, Intrinsics& intrinsics, TypeNamer& typeNamer)
+String writeNativeFunction(AST::NativeFunctionDeclaration& nativeFunctionDeclaration, MangledFunctionName outputFunctionName, Intrinsics& intrinsics, TypeNamer& typeNamer)
 {
     StringBuilder stringBuilder;
     if (nativeFunctionDeclaration.isCast()) {
@@ -205,7 +205,7 @@
     }
 
     if (nativeFunctionDeclaration.name().startsWith("operator."_str)) {
-        auto mangledFieldName = [&](const String& fieldName) -> String {
+        auto appendMangledFieldName = [&](StringBuilder& stringBuilder, const String& fieldName) {
             auto& unifyNode = nativeFunctionDeclaration.parameters()[0]->type()->unifyNode();
             auto& namedType = downcast<AST::NamedType>(unifyNode);
             if (is<AST::StructureDefinition>(namedType)) {
@@ -212,10 +212,11 @@
                 auto& structureDefinition = downcast<AST::StructureDefinition>(namedType);
                 auto* structureElement = structureDefinition.find(fieldName);
                 ASSERT(structureElement);
-                return typeNamer.mangledNameForStructureElement(*structureElement);
+                stringBuilder.flexibleAppend(typeNamer.mangledNameForStructureElement(*structureElement));
+                return;
             }
             ASSERT(is<AST::NativeTypeDeclaration>(namedType));
-            return fieldName;
+            stringBuilder.append(fieldName);
         };
 
         if (nativeFunctionDeclaration.name().endsWith("=")) {
@@ -223,12 +224,16 @@
             auto metalParameter1Name = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[0]->type());
             auto metalParameter2Name = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[1]->type());
             auto metalReturnName = typeNamer.mangledNameForType(nativeFunctionDeclaration.type());
+            stringBuilder.flexibleAppend(
+                metalReturnName, ' ', outputFunctionName, '(', metalParameter1Name, " v, ", metalParameter2Name, " n) {\n"
+                "    v."
+            );
+
             auto fieldName = nativeFunctionDeclaration.name().substring("operator."_str.length());
             fieldName = fieldName.substring(0, fieldName.length() - 1);
-            auto metalFieldName = mangledFieldName(fieldName);
-            stringBuilder.flexibleAppend(
-                metalReturnName, ' ', outputFunctionName, '(', metalParameter1Name, " v, ", metalParameter2Name, " n) {\n"
-                "    v.", metalFieldName, " = n;\n"
+            appendMangledFieldName(stringBuilder, fieldName);
+
+            stringBuilder.append(" = n;\n"
                 "    return v;\n"
                 "}\n"
             );
@@ -236,13 +241,17 @@
         }
 
         ASSERT(nativeFunctionDeclaration.parameters().size() == 1);
-        auto fieldName = nativeFunctionDeclaration.name().substring("operator."_str.length());
         auto metalParameterName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[0]->type());
         auto metalReturnName = typeNamer.mangledNameForType(nativeFunctionDeclaration.type());
-        auto metalFieldName = mangledFieldName(fieldName);
         stringBuilder.flexibleAppend(
             metalReturnName, ' ', outputFunctionName, '(', metalParameterName, " v) {\n"
-            "    return v.", metalFieldName, ";\n"
+            "    return v."
+        );
+
+        auto fieldName = nativeFunctionDeclaration.name().substring("operator."_str.length());
+        appendMangledFieldName(stringBuilder, fieldName);
+            
+        stringBuilder.append(";\n"
             "}\n"
         );
         return stringBuilder.toString();
@@ -252,9 +261,13 @@
         ASSERT(nativeFunctionDeclaration.parameters().size() == 1);
         auto metalParameterName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[0]->type());
         auto metalReturnName = typeNamer.mangledNameForType(nativeFunctionDeclaration.type());
+
+        stringBuilder.flexibleAppend(
+            metalReturnName, ' ', outputFunctionName, '(', metalParameterName, " v) {\n"
+            "    return &(v->"
+        );
+
         auto fieldName = nativeFunctionDeclaration.name().substring("operator&."_str.length());
-
-        String metalFieldName;
         auto& unnamedType = *nativeFunctionDeclaration.parameters()[0]->type();
         auto& unifyNode = downcast<AST::PointerType>(unnamedType).elementType().unifyNode();
         auto& namedType = downcast<AST::NamedType>(unifyNode);
@@ -262,13 +275,12 @@
             auto& structureDefinition = downcast<AST::StructureDefinition>(namedType);
             auto* structureElement = structureDefinition.find(fieldName);
             ASSERT(structureElement);
-            metalFieldName = typeNamer.mangledNameForStructureElement(*structureElement);
+            stringBuilder.flexibleAppend(typeNamer.mangledNameForStructureElement(*structureElement));
         } else
-            metalFieldName = fieldName;
+            stringBuilder.flexibleAppend(fieldName);
 
-        stringBuilder.flexibleAppend(
-            metalReturnName, ' ', outputFunctionName, '(', metalParameterName, " v) {\n"
-            "    return &(v->", metalFieldName, ");\n"
+        stringBuilder.append(
+            ");\n"
             "}\n"
         );
         return stringBuilder.toString();
@@ -512,13 +524,13 @@
         auto metalParameter1Name = typeNamer.mangledNameForType(textureType);
         auto metalParameter2Name = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[1]->type());
         auto metalParameter3Name = typeNamer.mangledNameForType(locationType);
-        String metalParameter4Name;
+        Optional<MangledTypeName> metalParameter4Name;
         if (nativeFunctionDeclaration.parameters().size() == 4)
             metalParameter4Name = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[3]->type());
         auto metalReturnName = typeNamer.mangledNameForType(returnType);
         stringBuilder.flexibleAppend(metalReturnName, ' ', outputFunctionName, '(', metalParameter1Name, " theTexture, ", metalParameter2Name, " theSampler, ", metalParameter3Name, " location");
-        if (!metalParameter4Name.isNull())
-            stringBuilder.flexibleAppend(", ", metalParameter4Name, " offset");
+        if (metalParameter4Name)
+            stringBuilder.flexibleAppend(", ", *metalParameter4Name, " offset");
         stringBuilder.append(
             ") {\n"
             "    return theTexture.sample(theSampler, "
@@ -528,7 +540,7 @@
             stringBuilder.flexibleAppend("location.", "xyzw"_str.substring(0, locationVectorLength - 1), ", location.", "xyzw"_str.substring(locationVectorLength - 1, 1));
         } else
             stringBuilder.append("location");
-        if (!metalParameter4Name.isNull())
+        if (metalParameter4Name)
             stringBuilder.append(", offset");
         stringBuilder.append(")");
         if (!textureType.isDepthTexture())
@@ -620,22 +632,22 @@
             ++index;
         auto widthTypeName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[index]->type());
         ++index;
-        String heightTypeName;
+        Optional<MangledTypeName> heightTypeName;
         if (textureType.textureDimension() >= 2) {
             heightTypeName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[index]->type());
             ++index;
         }
-        String depthTypeName;
+        Optional<MangledTypeName> depthTypeName;
         if (textureType.textureDimension() >= 3) {
             depthTypeName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[index]->type());
             ++index;
         }
-        String elementsTypeName;
+        Optional<MangledTypeName> elementsTypeName;
         if (textureType.isTextureArray()) {
             elementsTypeName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[index]->type());
             ++index;
         }
-        String numberOfLevelsTypeName;
+        Optional<MangledTypeName> numberOfLevelsTypeName;
         if (!textureType.isWritableTexture() && textureType.textureDimension() != 1) {
             numberOfLevelsTypeName = typeNamer.mangledNameForType(*nativeFunctionDeclaration.parameters()[index]->type());
             ++index;
@@ -647,14 +659,14 @@
         if (!textureType.isWritableTexture() && textureType.textureDimension() != 1)
             stringBuilder.append(", uint mipLevel");
         stringBuilder.flexibleAppend(", ", widthTypeName, " width");
-        if (!heightTypeName.isNull())
-            stringBuilder.flexibleAppend(", ", heightTypeName, " height");
-        if (!depthTypeName.isNull())
-            stringBuilder.flexibleAppend(", ", depthTypeName, " depth");
-        if (!elementsTypeName.isNull())
-            stringBuilder.flexibleAppend(", ", elementsTypeName, " elements");
-        if (!numberOfLevelsTypeName.isNull())
-            stringBuilder.flexibleAppend(", ", numberOfLevelsTypeName, " numberOfLevels");
+        if (heightTypeName)
+            stringBuilder.flexibleAppend(", ", *heightTypeName, " height");
+        if (depthTypeName)
+            stringBuilder.flexibleAppend(", ", *depthTypeName, " depth");
+        if (elementsTypeName)
+            stringBuilder.flexibleAppend(", ", *elementsTypeName, " elements");
+        if (numberOfLevelsTypeName)
+            stringBuilder.flexibleAppend(", ", *numberOfLevelsTypeName, " numberOfLevels");
         stringBuilder.append(
             ") {\n"
             "    if (width)\n"
@@ -663,7 +675,7 @@
         if (!textureType.isWritableTexture() && textureType.textureDimension() != 1)
             stringBuilder.append("mipLevel");
         stringBuilder.append(");\n");
-        if (!heightTypeName.isNull()) {
+        if (heightTypeName) {
             stringBuilder.append(
                 "    if (height)\n"
                 "        *height = theTexture.get_height("
@@ -672,7 +684,7 @@
                 stringBuilder.append("mipLevel");
             stringBuilder.append(");\n");
         }
-        if (!depthTypeName.isNull()) {
+        if (depthTypeName) {
             stringBuilder.append(
                 "    if (depth)\n"
                 "        *depth = theTexture.get_depth("
@@ -681,13 +693,13 @@
                 stringBuilder.append("mipLevel");
             stringBuilder.append(");\n");
         }
-        if (!elementsTypeName.isNull()) {
+        if (elementsTypeName) {
             stringBuilder.append(
                 "    if (elements)\n"
                 "        *elements = theTexture.get_array_size();\n"
             );
         }
-        if (!numberOfLevelsTypeName.isNull()) {
+        if (numberOfLevelsTypeName) {
             stringBuilder.append(
                 "    if (numberOfLevels)\n"
                 "        *numberOfLevels = theTexture.get_num_mip_levels();\n"

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -27,7 +27,7 @@
 
 #if ENABLE(WEBGPU)
 
-#include <wtf/text/WTFString.h>
+#include "WHLSLMangledNames.h"
 
 namespace WebCore {
 
@@ -45,7 +45,7 @@
 
 class TypeNamer;
 
-String writeNativeFunction(AST::NativeFunctionDeclaration&, String& outputFunctionName, Intrinsics&, TypeNamer&);
+String writeNativeFunction(AST::NativeFunctionDeclaration&, MangledFunctionName outputFunctionName, Intrinsics&, TypeNamer&);
 
 }
 

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp	2019-08-05 03:26:33 UTC (rev 248266)
@@ -61,7 +61,7 @@
 class BaseTypeNameNode {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    BaseTypeNameNode(BaseTypeNameNode* parent, String&& mangledName)
+    BaseTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName)
         : m_parent(parent)
         , m_mangledName(mangledName)
     {
@@ -77,18 +77,18 @@
         m_children.append(WTFMove(child));
     }
     BaseTypeNameNode* parent() { return m_parent; }
-    const String& mangledName() const { return m_mangledName; }
+    MangledTypeName mangledName() const { return m_mangledName; }
 
 private:
     Vector<UniqueRef<BaseTypeNameNode>> m_children;
     BaseTypeNameNode* m_parent;
-    String m_mangledName;
+    MangledTypeName m_mangledName;
 };
 
 class ArrayTypeNameNode : public BaseTypeNameNode {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    ArrayTypeNameNode(BaseTypeNameNode* parent, String&& mangledName, unsigned numElements)
+    ArrayTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, unsigned numElements)
         : BaseTypeNameNode(parent, WTFMove(mangledName))
         , m_numElements(numElements)
     {
@@ -104,7 +104,7 @@
 class ArrayReferenceTypeNameNode : public BaseTypeNameNode {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    ArrayReferenceTypeNameNode(BaseTypeNameNode* parent, String&& mangledName, AST::AddressSpace addressSpace)
+    ArrayReferenceTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::AddressSpace addressSpace)
         : BaseTypeNameNode(parent, WTFMove(mangledName))
         , m_addressSpace(addressSpace)
     {
@@ -120,7 +120,7 @@
 class PointerTypeNameNode : public BaseTypeNameNode {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    PointerTypeNameNode(BaseTypeNameNode* parent, String&& mangledName, AST::AddressSpace addressSpace)
+    PointerTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::AddressSpace addressSpace)
         : BaseTypeNameNode(parent, WTFMove(mangledName))
         , m_addressSpace(addressSpace)
     {
@@ -136,7 +136,7 @@
 class ReferenceTypeNameNode : public BaseTypeNameNode {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    ReferenceTypeNameNode(BaseTypeNameNode* parent, String&& mangledName, AST::NamedType& namedType)
+    ReferenceTypeNameNode(BaseTypeNameNode* parent, MangledTypeName&& mangledName, AST::NamedType& namedType)
         : BaseTypeNameNode(parent, WTFMove(mangledName))
         , m_namedType(namedType)
     {
@@ -354,7 +354,7 @@
 class MetalTypeDeclarationWriter : public Visitor {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    MetalTypeDeclarationWriter(std::function<String(AST::NamedType&)>&& mangledNameForNamedType)
+    MetalTypeDeclarationWriter(std::function<MangledOrNativeTypeName(AST::NamedType&)>&& mangledNameForNamedType)
         : m_mangledNameForNamedType(WTFMove(mangledNameForNamedType))
     {
     }
@@ -367,13 +367,13 @@
         m_stringBuilder.flexibleAppend("struct ", m_mangledNameForNamedType(structureDefinition), ";\n");
     }
 
-    std::function<String(AST::NamedType&)> m_mangledNameForNamedType;
+    std::function<MangledOrNativeTypeName(AST::NamedType&)> m_mangledNameForNamedType;
     StringBuilder m_stringBuilder;
 };
 
 String TypeNamer::metalTypeDeclarations()
 {
-    MetalTypeDeclarationWriter metalTypeDeclarationWriter([&](AST::NamedType& namedType) -> String {
+    MetalTypeDeclarationWriter metalTypeDeclarationWriter([&](AST::NamedType& namedType) -> MangledOrNativeTypeName {
         return mangledNameForType(namedType);
     });
     metalTypeDeclarationWriter.Visitor::visit(m_program);
@@ -460,12 +460,12 @@
     return stringBuilder.toString();
 }
 
-String TypeNamer::mangledNameForType(AST::UnnamedType& unnamedType)
+MangledTypeName TypeNamer::mangledNameForType(AST::UnnamedType& unnamedType)
 {
     return find(unnamedType, m_trie).mangledName();
 }
 
-String TypeNamer::mangledNameForType(AST::NamedType& namedType)
+MangledOrNativeTypeName TypeNamer::mangledNameForType(AST::NamedType& namedType)
 {
     if (is<AST::NativeTypeDeclaration>(namedType))
         return mangledNameForType(downcast<AST::NativeTypeDeclaration>(namedType));
@@ -475,7 +475,7 @@
 }
 
 
-String TypeNamer::mangledNameForEnumerationMember(AST::EnumerationMember& enumerationMember)
+MangledEnumerationMemberName TypeNamer::mangledNameForEnumerationMember(AST::EnumerationMember& enumerationMember)
 {
     auto iterator = m_enumerationMemberMapping.find(&enumerationMember);
     ASSERT(iterator != m_enumerationMemberMapping.end());
@@ -482,7 +482,7 @@
     return iterator->value;
 }
 
-String TypeNamer::mangledNameForStructureElement(AST::StructureElement& structureElement)
+MangledStructureElementName TypeNamer::mangledNameForStructureElement(AST::StructureElement& structureElement)
 {
     auto iterator = m_structureElementMapping.find(&structureElement);
     ASSERT(iterator != m_structureElementMapping.end());

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -27,10 +27,9 @@
 
 #if ENABLE(WEBGPU)
 
+#include "WHLSLMangledNames.h"
 #include "WHLSLVisitor.h"
 #include <wtf/HashMap.h>
-#include <wtf/text/StringConcatenate.h>
-#include <wtf/text/StringConcatenateNumbers.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -64,21 +63,14 @@
 
     // Must be called after calling metalTypes().
     String mangledNameForType(AST::NativeTypeDeclaration&);
-    String mangledNameForType(AST::UnnamedType&);
-    String mangledNameForType(AST::NamedType&);
-    String mangledNameForEnumerationMember(AST::EnumerationMember&);
-    String mangledNameForStructureElement(AST::StructureElement&);
+    MangledTypeName mangledNameForType(AST::UnnamedType&);
+    MangledOrNativeTypeName mangledNameForType(AST::NamedType&);
+    MangledEnumerationMemberName mangledNameForEnumerationMember(AST::EnumerationMember&);
+    MangledStructureElementName mangledNameForStructureElement(AST::StructureElement&);
 
-    String generateNextTypeName()
-    {
-        return makeString("type", m_typeCount++);
-    }
+    MangledTypeName generateNextTypeName() { return { m_typeCount++ }; }
+    MangledStructureElementName generateNextStructureElementName() { return { m_structureElementCount++ }; }
 
-    String generateNextStructureElementName()
-    {
-        return makeString("structureElement", m_structureElementCount++);
-    }
-
 private:
     void visit(AST::UnnamedType&) override;
     void visit(AST::EnumerationDefinition&) override;
@@ -88,10 +80,7 @@
     void visit(AST::_expression_&) override;
     void visit(AST::CallExpression&) override;
 
-    String generateNextEnumerationMemberName()
-    {
-        return makeString("enumerationMember", m_enumerationMemberCount++);
-    }
+    MangledEnumerationMemberName generateNextEnumerationMemberName() { return { m_enumerationMemberCount++ }; }
 
     void emitNamedTypeDefinition(AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
     void emitUnnamedTypeDefinition(BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
@@ -105,10 +94,10 @@
     Program& m_program;
     Vector<UniqueRef<BaseTypeNameNode>> m_trie;
     HashMap<AST::UnnamedType*, BaseTypeNameNode*> m_unnamedTypeMapping;
-    HashMap<AST::NamedType*, String> m_namedTypeMapping;
+    HashMap<AST::NamedType*, MangledTypeName> m_namedTypeMapping;
     HashMap<AST::NamedType*, Vector<std::reference_wrapper<BaseTypeNameNode>>> m_dependencyGraph;
-    HashMap<AST::EnumerationMember*, String> m_enumerationMemberMapping;
-    HashMap<AST::StructureElement*, String> m_structureElementMapping;
+    HashMap<AST::EnumerationMember*, MangledEnumerationMemberName> m_enumerationMemberMapping;
+    HashMap<AST::StructureElement*, MangledStructureElementName> m_structureElementMapping;
     unsigned m_typeCount { 0 };
     unsigned m_enumerationMemberCount { 0 };
     unsigned m_structureElementCount { 0 };

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h (248265 => 248266)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h	2019-08-05 03:26:33 UTC (rev 248266)
@@ -28,6 +28,7 @@
 #if ENABLE(WEBGPU)
 
 #include "WHLSLError.h"
+#include "WHLSLMangledNames.h"
 #include "WHLSLPipelineDescriptor.h"
 #include <wtf/text/WTFString.h>
 
@@ -37,8 +38,8 @@
 
 struct RenderPrepareResult {
     String metalSource;
-    String mangledVertexEntryPointName;
-    String mangledFragmentEntryPointName;
+    Metal::MangledFunctionName mangledVertexEntryPointName;
+    Metal::MangledFunctionName mangledFragmentEntryPointName;
 };
 Expected<RenderPrepareResult, String> prepare(String& whlslSource, RenderPipelineDescriptor&);
 
@@ -50,7 +51,7 @@
 
 struct ComputePrepareResult {
     String metalSource;
-    String mangledEntryPointName;
+    Metal::MangledFunctionName mangledEntryPointName;
     ComputeDimensions computeDimensions;
 };
 Expected<ComputePrepareResult, String> prepare(String& whlslSource, ComputePipelineDescriptor&);

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (248265 => 248266)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2019-08-05 03:26:33 UTC (rev 248266)
@@ -9734,6 +9734,7 @@
 		7C7903BC1F86FF3400463A70 /* PlaceholderRenderingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlaceholderRenderingContext.h; sourceTree = "<group>"; };
 		7C7941E21C56C29300A4C58E /* DataDetectorsCoreSoftLink.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DataDetectorsCoreSoftLink.mm; sourceTree = "<group>"; };
 		7C7941E31C56C29300A4C58E /* DataDetectorsCoreSoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataDetectorsCoreSoftLink.h; sourceTree = "<group>"; };
+		7C7C769C22F67ECD0032BCCD /* WHLSLMangledNames.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WHLSLMangledNames.h; sourceTree = "<group>"; };
 		7C8139A31ED6281D00CE26E8 /* JSDOMAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMAttribute.h; sourceTree = "<group>"; };
 		7C8139A41ED6281D00CE26E8 /* JSDOMOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMOperation.h; sourceTree = "<group>"; };
 		7C8139A51ED6281D00CE26E8 /* JSDOMOperationReturningPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMOperationReturningPromise.h; sourceTree = "<group>"; };
@@ -17172,6 +17173,7 @@
 				1CECB3BB21F511AA00F44542 /* WHLSLEntryPointScaffolding.h */,
 				1CECB3AF21F2B98400F44542 /* WHLSLFunctionWriter.cpp */,
 				1CECB3B221F2B98600F44542 /* WHLSLFunctionWriter.h */,
+				7C7C769C22F67ECD0032BCCD /* WHLSLMangledNames.h */,
 				1CECB3B521F50AC700F44542 /* WHLSLMetalCodeGenerator.cpp */,
 				1CECB3B621F50AC700F44542 /* WHLSLMetalCodeGenerator.h */,
 				1CECB3B821F50D1000F44542 /* WHLSLNativeFunctionWriter.cpp */,

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm (248265 => 248266)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm	2019-08-05 03:26:33 UTC (rev 248266)
@@ -94,7 +94,7 @@
         ASSERT(computeLibrary);
         // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195771 Once we zero-fill variables, there should be no warnings, so we should be able to ASSERT(!error) here.
 
-        computeEntryPoint = whlslCompileResult->mangledEntryPointName;
+        computeEntryPoint = whlslCompileResult->mangledEntryPointName.toString();
     } else {
         computeLibrary = computeStage.module->platformShaderModule();
         computeEntryPoint = computeStage.entryPoint;

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm (248265 => 248266)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm	2019-08-04 18:32:44 UTC (rev 248265)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm	2019-08-05 03:26:33 UTC (rev 248266)
@@ -411,8 +411,8 @@
         // FIXME: https://bugs.webkit.org/show_bug.cgi?id=195771 Once we zero-fill variables, there should be no warnings, so we should be able to ASSERT(!error) here.
 
         fragmentLibrary = vertexLibrary;
-        vertexEntryPoint = whlslCompileResult->mangledVertexEntryPointName;
-        fragmentEntryPoint = whlslCompileResult->mangledFragmentEntryPointName;
+        vertexEntryPoint = whlslCompileResult->mangledVertexEntryPointName.toString();
+        fragmentEntryPoint = whlslCompileResult->mangledFragmentEntryPointName.toString();
     } else {
         vertexLibrary = vertexStage.module->platformShaderModule();
         vertexEntryPoint = vertexStage.entryPoint;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to