xref: /aosp_15_r20/external/angle/src/compiler/translator/Name.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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/Name.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/tree_util/IntermTraverse.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker namespace sh
12*8975f5c5SAndroid Build Coastguard Worker {
13*8975f5c5SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker template <typename T>
GetName(T const & object)16*8975f5c5SAndroid Build Coastguard Worker static ImmutableString GetName(T const &object)
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker     if (object.symbolType() == SymbolType::Empty)
19*8975f5c5SAndroid Build Coastguard Worker     {
20*8975f5c5SAndroid Build Coastguard Worker         return kEmptyImmutableString;
21*8975f5c5SAndroid Build Coastguard Worker     }
22*8975f5c5SAndroid Build Coastguard Worker     return object.name();
23*8975f5c5SAndroid Build Coastguard Worker }
24*8975f5c5SAndroid Build Coastguard Worker 
Name(const TField & field)25*8975f5c5SAndroid Build Coastguard Worker Name::Name(const TField &field) : Name(GetName(field), field.symbolType()) {}
26*8975f5c5SAndroid Build Coastguard Worker 
Name(const TSymbol & symbol)27*8975f5c5SAndroid Build Coastguard Worker Name::Name(const TSymbol &symbol) : Name(GetName(symbol), symbol.symbolType()) {}
28*8975f5c5SAndroid Build Coastguard Worker 
operator ==(const Name & other) const29*8975f5c5SAndroid Build Coastguard Worker bool Name::operator==(const Name &other) const
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker     return mRawName == other.mRawName && mSymbolType == other.mSymbolType;
32*8975f5c5SAndroid Build Coastguard Worker }
33*8975f5c5SAndroid Build Coastguard Worker 
operator !=(const Name & other) const34*8975f5c5SAndroid Build Coastguard Worker bool Name::operator!=(const Name &other) const
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     return !(*this == other);
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
operator <(const Name & other) const39*8975f5c5SAndroid Build Coastguard Worker bool Name::operator<(const Name &other) const
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker     if (mRawName < other.mRawName)
42*8975f5c5SAndroid Build Coastguard Worker     {
43*8975f5c5SAndroid Build Coastguard Worker         return true;
44*8975f5c5SAndroid Build Coastguard Worker     }
45*8975f5c5SAndroid Build Coastguard Worker     if (other.mRawName < mRawName)
46*8975f5c5SAndroid Build Coastguard Worker     {
47*8975f5c5SAndroid Build Coastguard Worker         return false;
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker     return mSymbolType < other.mSymbolType;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker 
empty() const52*8975f5c5SAndroid Build Coastguard Worker bool Name::empty() const
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker     return mSymbolType == SymbolType::Empty;
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker 
beginsWith(const Name & prefix) const57*8975f5c5SAndroid Build Coastguard Worker bool Name::beginsWith(const Name &prefix) const
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker     if (mSymbolType != prefix.mSymbolType)
60*8975f5c5SAndroid Build Coastguard Worker     {
61*8975f5c5SAndroid Build Coastguard Worker         return false;
62*8975f5c5SAndroid Build Coastguard Worker     }
63*8975f5c5SAndroid Build Coastguard Worker     return mRawName.beginsWith(prefix.mRawName);
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker 
emit(TInfoSinkBase & out) const66*8975f5c5SAndroid Build Coastguard Worker void Name::emit(TInfoSinkBase &out) const
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     emitImpl(out);
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker template <typename T>
emitImpl(T & out) const72*8975f5c5SAndroid Build Coastguard Worker void Name::emitImpl(T &out) const
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker     switch (mSymbolType)
75*8975f5c5SAndroid Build Coastguard Worker     {
76*8975f5c5SAndroid Build Coastguard Worker         case SymbolType::BuiltIn:
77*8975f5c5SAndroid Build Coastguard Worker             ASSERT(!mRawName.empty());
78*8975f5c5SAndroid Build Coastguard Worker             out << mRawName;
79*8975f5c5SAndroid Build Coastguard Worker             break;
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker         case SymbolType::UserDefined:
82*8975f5c5SAndroid Build Coastguard Worker             ASSERT(!mRawName.empty());
83*8975f5c5SAndroid Build Coastguard Worker             if (mRawName != "main")
84*8975f5c5SAndroid Build Coastguard Worker             {
85*8975f5c5SAndroid Build Coastguard Worker                 out << kUserDefinedNamePrefix << mRawName;
86*8975f5c5SAndroid Build Coastguard Worker             }
87*8975f5c5SAndroid Build Coastguard Worker             else
88*8975f5c5SAndroid Build Coastguard Worker             {
89*8975f5c5SAndroid Build Coastguard Worker                 out << mRawName;
90*8975f5c5SAndroid Build Coastguard Worker             }
91*8975f5c5SAndroid Build Coastguard Worker             break;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker         case SymbolType::AngleInternal:
94*8975f5c5SAndroid Build Coastguard Worker             ASSERT(!mRawName.empty());
95*8975f5c5SAndroid Build Coastguard Worker             if (mRawName.beginsWith(kAngleInternalPrefix))
96*8975f5c5SAndroid Build Coastguard Worker             {
97*8975f5c5SAndroid Build Coastguard Worker                 out << mRawName;
98*8975f5c5SAndroid Build Coastguard Worker             }
99*8975f5c5SAndroid Build Coastguard Worker             else
100*8975f5c5SAndroid Build Coastguard Worker             {
101*8975f5c5SAndroid Build Coastguard Worker                 out << kAngleInternalPrefix << '_' << mRawName;
102*8975f5c5SAndroid Build Coastguard Worker             }
103*8975f5c5SAndroid Build Coastguard Worker             break;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker         case SymbolType::Empty:
106*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
107*8975f5c5SAndroid Build Coastguard Worker             break;
108*8975f5c5SAndroid Build Coastguard Worker     }
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const Name & name)111*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &out, const Name &name)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     name.emitImpl(out);
114*8975f5c5SAndroid Build Coastguard Worker     return out;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker namespace
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker // NOTE: This matches more things than FindSymbolNode.
123*8975f5c5SAndroid Build Coastguard Worker class ExpressionContainsNameVisitor : public TIntermTraverser
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     Name mName;
126*8975f5c5SAndroid Build Coastguard Worker     bool mFoundName = false;
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker   public:
ExpressionContainsNameVisitor(const Name & name)129*8975f5c5SAndroid Build Coastguard Worker     ExpressionContainsNameVisitor(const Name &name)
130*8975f5c5SAndroid Build Coastguard Worker         : TIntermTraverser(true, false, false), mName(name)
131*8975f5c5SAndroid Build Coastguard Worker     {}
132*8975f5c5SAndroid Build Coastguard Worker 
foundName() const133*8975f5c5SAndroid Build Coastguard Worker     bool foundName() const { return mFoundName; }
134*8975f5c5SAndroid Build Coastguard Worker 
visitSymbol(TIntermSymbol * node)135*8975f5c5SAndroid Build Coastguard Worker     void visitSymbol(TIntermSymbol *node) override
136*8975f5c5SAndroid Build Coastguard Worker     {
137*8975f5c5SAndroid Build Coastguard Worker         if (Name(node->variable()) == mName)
138*8975f5c5SAndroid Build Coastguard Worker         {
139*8975f5c5SAndroid Build Coastguard Worker             mFoundName = true;
140*8975f5c5SAndroid Build Coastguard Worker         }
141*8975f5c5SAndroid Build Coastguard Worker     }
142*8975f5c5SAndroid Build Coastguard Worker 
visitSwizzle(Visit,TIntermSwizzle *)143*8975f5c5SAndroid Build Coastguard Worker     bool visitSwizzle(Visit, TIntermSwizzle *) override { return !mFoundName; }
144*8975f5c5SAndroid Build Coastguard Worker 
visitBinary(Visit visit,TIntermBinary * node)145*8975f5c5SAndroid Build Coastguard Worker     bool visitBinary(Visit visit, TIntermBinary *node) override { return !mFoundName; }
146*8975f5c5SAndroid Build Coastguard Worker 
visitUnary(Visit visit,TIntermUnary * node)147*8975f5c5SAndroid Build Coastguard Worker     bool visitUnary(Visit visit, TIntermUnary *node) override { return !mFoundName; }
148*8975f5c5SAndroid Build Coastguard Worker 
visitTernary(Visit visit,TIntermTernary * node)149*8975f5c5SAndroid Build Coastguard Worker     bool visitTernary(Visit visit, TIntermTernary *node) override { return !mFoundName; }
150*8975f5c5SAndroid Build Coastguard Worker 
visitAggregate(Visit visit,TIntermAggregate * node)151*8975f5c5SAndroid Build Coastguard Worker     bool visitAggregate(Visit visit, TIntermAggregate *node) override
152*8975f5c5SAndroid Build Coastguard Worker     {
153*8975f5c5SAndroid Build Coastguard Worker         if (node->isConstructor())
154*8975f5c5SAndroid Build Coastguard Worker         {
155*8975f5c5SAndroid Build Coastguard Worker             const TType &type           = node->getType();
156*8975f5c5SAndroid Build Coastguard Worker             const TStructure *structure = type.getStruct();
157*8975f5c5SAndroid Build Coastguard Worker             if (structure && Name(*structure) == mName)
158*8975f5c5SAndroid Build Coastguard Worker             {
159*8975f5c5SAndroid Build Coastguard Worker                 mFoundName = true;
160*8975f5c5SAndroid Build Coastguard Worker             }
161*8975f5c5SAndroid Build Coastguard Worker         }
162*8975f5c5SAndroid Build Coastguard Worker         else
163*8975f5c5SAndroid Build Coastguard Worker         {
164*8975f5c5SAndroid Build Coastguard Worker             const TFunction *func = node->getFunction();
165*8975f5c5SAndroid Build Coastguard Worker             if (func && Name(*func) == mName)
166*8975f5c5SAndroid Build Coastguard Worker             {
167*8975f5c5SAndroid Build Coastguard Worker                 mFoundName = true;
168*8975f5c5SAndroid Build Coastguard Worker             }
169*8975f5c5SAndroid Build Coastguard Worker         }
170*8975f5c5SAndroid Build Coastguard Worker         return !mFoundName;
171*8975f5c5SAndroid Build Coastguard Worker     }
172*8975f5c5SAndroid Build Coastguard Worker 
visitIfElse(Visit visit,TIntermIfElse * node)173*8975f5c5SAndroid Build Coastguard Worker     bool visitIfElse(Visit visit, TIntermIfElse *node) override
174*8975f5c5SAndroid Build Coastguard Worker     {
175*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
176*8975f5c5SAndroid Build Coastguard Worker         return false;
177*8975f5c5SAndroid Build Coastguard Worker     }
178*8975f5c5SAndroid Build Coastguard Worker 
visitSwitch(Visit,TIntermSwitch *)179*8975f5c5SAndroid Build Coastguard Worker     bool visitSwitch(Visit, TIntermSwitch *) override
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
182*8975f5c5SAndroid Build Coastguard Worker         return false;
183*8975f5c5SAndroid Build Coastguard Worker     }
visitCase(Visit,TIntermCase *)184*8975f5c5SAndroid Build Coastguard Worker     bool visitCase(Visit, TIntermCase *) override
185*8975f5c5SAndroid Build Coastguard Worker     {
186*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
187*8975f5c5SAndroid Build Coastguard Worker         return false;
188*8975f5c5SAndroid Build Coastguard Worker     }
189*8975f5c5SAndroid Build Coastguard Worker 
visitFunctionPrototype(TIntermFunctionPrototype *)190*8975f5c5SAndroid Build Coastguard Worker     void visitFunctionPrototype(TIntermFunctionPrototype *) override { UNREACHABLE(); }
191*8975f5c5SAndroid Build Coastguard Worker 
visitFunctionDefinition(Visit,TIntermFunctionDefinition *)192*8975f5c5SAndroid Build Coastguard Worker     bool visitFunctionDefinition(Visit, TIntermFunctionDefinition *) override
193*8975f5c5SAndroid Build Coastguard Worker     {
194*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
195*8975f5c5SAndroid Build Coastguard Worker         return false;
196*8975f5c5SAndroid Build Coastguard Worker     }
197*8975f5c5SAndroid Build Coastguard Worker 
visitBlock(Visit,TIntermBlock *)198*8975f5c5SAndroid Build Coastguard Worker     bool visitBlock(Visit, TIntermBlock *) override
199*8975f5c5SAndroid Build Coastguard Worker     {
200*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
201*8975f5c5SAndroid Build Coastguard Worker         return false;
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker 
visitGlobalQualifierDeclaration(Visit,TIntermGlobalQualifierDeclaration *)204*8975f5c5SAndroid Build Coastguard Worker     bool visitGlobalQualifierDeclaration(Visit, TIntermGlobalQualifierDeclaration *) override
205*8975f5c5SAndroid Build Coastguard Worker     {
206*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
207*8975f5c5SAndroid Build Coastguard Worker         return false;
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker 
visitDeclaration(Visit,TIntermDeclaration *)210*8975f5c5SAndroid Build Coastguard Worker     bool visitDeclaration(Visit, TIntermDeclaration *) override
211*8975f5c5SAndroid Build Coastguard Worker     {
212*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
213*8975f5c5SAndroid Build Coastguard Worker         return false;
214*8975f5c5SAndroid Build Coastguard Worker     }
215*8975f5c5SAndroid Build Coastguard Worker 
visitLoop(Visit,TIntermLoop *)216*8975f5c5SAndroid Build Coastguard Worker     bool visitLoop(Visit, TIntermLoop *) override
217*8975f5c5SAndroid Build Coastguard Worker     {
218*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
219*8975f5c5SAndroid Build Coastguard Worker         return false;
220*8975f5c5SAndroid Build Coastguard Worker     }
221*8975f5c5SAndroid Build Coastguard Worker 
visitBranch(Visit,TIntermBranch *)222*8975f5c5SAndroid Build Coastguard Worker     bool visitBranch(Visit, TIntermBranch *) override
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
225*8975f5c5SAndroid Build Coastguard Worker         return false;
226*8975f5c5SAndroid Build Coastguard Worker     }
227*8975f5c5SAndroid Build Coastguard Worker 
visitPreprocessorDirective(TIntermPreprocessorDirective *)228*8975f5c5SAndroid Build Coastguard Worker     void visitPreprocessorDirective(TIntermPreprocessorDirective *) override { UNREACHABLE(); }
229*8975f5c5SAndroid Build Coastguard Worker };
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
232*8975f5c5SAndroid Build Coastguard Worker 
ExpressionContainsName(const Name & name,TIntermTyped & node)233*8975f5c5SAndroid Build Coastguard Worker bool ExpressionContainsName(const Name &name, TIntermTyped &node)
234*8975f5c5SAndroid Build Coastguard Worker {
235*8975f5c5SAndroid Build Coastguard Worker     ExpressionContainsNameVisitor visitor(name);
236*8975f5c5SAndroid Build Coastguard Worker     node.traverse(&visitor);
237*8975f5c5SAndroid Build Coastguard Worker     return visitor.foundName();
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
241