1 //
2 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 #include <cctype>
8 #include <cstring>
9 #include <limits>
10 #include <unordered_map>
11 #include <unordered_set>
12
13 #include "compiler/translator/msl/IdGen.h"
14
15 using namespace sh;
16
17 ////////////////////////////////////////////////////////////////////////////////
18
IdGen()19 IdGen::IdGen() {}
20
21 template <typename String, typename StringToImmutable>
createNewName(size_t count,const String * baseNames,const StringToImmutable & toImmutable)22 Name IdGen::createNewName(size_t count,
23 const String *baseNames,
24 const StringToImmutable &toImmutable)
25 {
26 const unsigned id = mNext++;
27 char idBuffer[std::numeric_limits<unsigned>::digits10 + 1];
28 snprintf(idBuffer, sizeof(idBuffer), "%u", id);
29
30 mNewNameBuffer.clear();
31 mNewNameBuffer += '_';
32 mNewNameBuffer += idBuffer;
33
34 for (size_t i = 0; i < count; ++i)
35 {
36 const ImmutableString baseName = toImmutable(baseNames[i]);
37 if (!baseName.empty())
38 {
39 const char *base = baseName.data();
40 if (baseName.beginsWith(kAngleInternalPrefix))
41 {
42 // skip 'ANGLE' or 'ANGLE_' prefix
43 base += sizeof(kAngleInternalPrefix) - 1;
44 if (*base == '_')
45 {
46 ++base;
47 }
48 }
49
50 mNewNameBuffer += '_';
51 mNewNameBuffer += base;
52 }
53 }
54
55 return Name(ImmutableString(mNewNameBuffer), SymbolType::AngleInternal);
56 }
57
createNewName(const ImmutableString & baseName)58 Name IdGen::createNewName(const ImmutableString &baseName)
59 {
60 return createNewName({baseName});
61 }
62
createNewName(const Name & baseName)63 Name IdGen::createNewName(const Name &baseName)
64 {
65 return createNewName(baseName.rawName());
66 }
67
createNewName(const char * baseName)68 Name IdGen::createNewName(const char *baseName)
69 {
70 return createNewName(ImmutableString(baseName));
71 }
72
createNewName(std::initializer_list<ImmutableString> baseNames)73 Name IdGen::createNewName(std::initializer_list<ImmutableString> baseNames)
74 {
75 return createNewName(baseNames.size(), baseNames.begin(),
76 [](const ImmutableString &s) { return s; });
77 }
78
createNewName(std::initializer_list<Name> baseNames)79 Name IdGen::createNewName(std::initializer_list<Name> baseNames)
80 {
81 return createNewName(baseNames.size(), baseNames.begin(),
82 [](const Name &s) { return s.rawName(); });
83 }
84
createNewName(std::initializer_list<const char * > baseNames)85 Name IdGen::createNewName(std::initializer_list<const char *> baseNames)
86 {
87 return createNewName(baseNames.size(), baseNames.begin(),
88 [](const char *s) { return ImmutableString(s); });
89 }
90
createNewName()91 Name IdGen::createNewName()
92 {
93 // TODO(anglebug.com/40096755): refactor this later.
94 return createNewName<int>(0, nullptr, [](int) { return kEmptyImmutableString; });
95 }
96