xref: /aosp_15_r20/external/angle/src/compiler/translator/msl/IdGen.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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