xref: /aosp_15_r20/external/angle/src/compiler/translator/HashNames.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/HashNames.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableString.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableStringBuilder.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/IntermNode.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Symbol.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker namespace sh
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker constexpr const ImmutableString kHashedNamePrefix("webgl_");
20*8975f5c5SAndroid Build Coastguard Worker 
HashName(const ImmutableString & name,ShHashFunction64 hashFunction)21*8975f5c5SAndroid Build Coastguard Worker ImmutableString HashName(const ImmutableString &name, ShHashFunction64 hashFunction)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!name.empty());
24*8975f5c5SAndroid Build Coastguard Worker     ASSERT(hashFunction);
25*8975f5c5SAndroid Build Coastguard Worker     khronos_uint64_t number = (*hashFunction)(name.data(), name.length());
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker     // Build the hashed name in place.
28*8975f5c5SAndroid Build Coastguard Worker     static const unsigned int kHexStrMaxLength = sizeof(number) * 2;
29*8975f5c5SAndroid Build Coastguard Worker     static const size_t kHashedNameMaxLength   = kHashedNamePrefix.length() + kHexStrMaxLength;
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker     ImmutableStringBuilder hashedName(kHashedNameMaxLength);
32*8975f5c5SAndroid Build Coastguard Worker     hashedName << kHashedNamePrefix;
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     hashedName.appendHex(number);
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker     return hashedName;
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
AddToNameMapIfNotMapped(const ImmutableString & name,const ImmutableString & hashedName,NameMap * nameMap)39*8975f5c5SAndroid Build Coastguard Worker void AddToNameMapIfNotMapped(const ImmutableString &name,
40*8975f5c5SAndroid Build Coastguard Worker                              const ImmutableString &hashedName,
41*8975f5c5SAndroid Build Coastguard Worker                              NameMap *nameMap)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     if (nameMap)
44*8975f5c5SAndroid Build Coastguard Worker     {
45*8975f5c5SAndroid Build Coastguard Worker         NameMap::const_iterator it = nameMap->find(name.data());
46*8975f5c5SAndroid Build Coastguard Worker         if (it != nameMap->end())
47*8975f5c5SAndroid Build Coastguard Worker         {
48*8975f5c5SAndroid Build Coastguard Worker             // (How bout returning?)
49*8975f5c5SAndroid Build Coastguard Worker             return;
50*8975f5c5SAndroid Build Coastguard Worker         }
51*8975f5c5SAndroid Build Coastguard Worker         (*nameMap)[name.data()] = hashedName.data();
52*8975f5c5SAndroid Build Coastguard Worker     }
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
56*8975f5c5SAndroid Build Coastguard Worker 
HashName(const ImmutableString & name,ShHashFunction64 hashFunction,NameMap * nameMap)57*8975f5c5SAndroid Build Coastguard Worker ImmutableString HashName(const ImmutableString &name,
58*8975f5c5SAndroid Build Coastguard Worker                          ShHashFunction64 hashFunction,
59*8975f5c5SAndroid Build Coastguard Worker                          NameMap *nameMap)
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker     const ImmutableString kUnhashedNamePrefix(kUserDefinedNamePrefix);
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     if (hashFunction == nullptr)
64*8975f5c5SAndroid Build Coastguard Worker     {
65*8975f5c5SAndroid Build Coastguard Worker         if (name.length() + kUnhashedNamePrefix.length() > kESSLMaxIdentifierLength)
66*8975f5c5SAndroid Build Coastguard Worker         {
67*8975f5c5SAndroid Build Coastguard Worker             // If the identifier length is already close to the limit, we can't prefix it. This is
68*8975f5c5SAndroid Build Coastguard Worker             // not a problem since there are no builtins or ANGLE's internal variables that would
69*8975f5c5SAndroid Build Coastguard Worker             // have as long names and could conflict.
70*8975f5c5SAndroid Build Coastguard Worker             return name;
71*8975f5c5SAndroid Build Coastguard Worker         }
72*8975f5c5SAndroid Build Coastguard Worker         ImmutableStringBuilder prefixedName(kUnhashedNamePrefix.length() + name.length());
73*8975f5c5SAndroid Build Coastguard Worker         prefixedName << kUnhashedNamePrefix << name;
74*8975f5c5SAndroid Build Coastguard Worker         ImmutableString res = prefixedName;
75*8975f5c5SAndroid Build Coastguard Worker         AddToNameMapIfNotMapped(name, res, nameMap);
76*8975f5c5SAndroid Build Coastguard Worker         return res;
77*8975f5c5SAndroid Build Coastguard Worker     }
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     // Has a hash function
80*8975f5c5SAndroid Build Coastguard Worker     ImmutableString hashedName = HashName(name, hashFunction);
81*8975f5c5SAndroid Build Coastguard Worker     AddToNameMapIfNotMapped(name, hashedName, nameMap);
82*8975f5c5SAndroid Build Coastguard Worker     return hashedName;
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker 
HashName(const TSymbol * symbol,ShHashFunction64 hashFunction,NameMap * nameMap)85*8975f5c5SAndroid Build Coastguard Worker ImmutableString HashName(const TSymbol *symbol, ShHashFunction64 hashFunction, NameMap *nameMap)
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker     if (symbol->symbolType() == SymbolType::Empty)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         return kEmptyImmutableString;
90*8975f5c5SAndroid Build Coastguard Worker     }
91*8975f5c5SAndroid Build Coastguard Worker     if (symbol->symbolType() == SymbolType::AngleInternal ||
92*8975f5c5SAndroid Build Coastguard Worker         symbol->symbolType() == SymbolType::BuiltIn)
93*8975f5c5SAndroid Build Coastguard Worker     {
94*8975f5c5SAndroid Build Coastguard Worker         return symbol->name();
95*8975f5c5SAndroid Build Coastguard Worker     }
96*8975f5c5SAndroid Build Coastguard Worker     return HashName(symbol->name(), hashFunction, nameMap);
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
100