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