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 #ifndef COMPILER_TRANSLATOR_NAME_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_TRANSLATOR_NAME_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableString.h" 11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/InfoSink.h" 12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/IntermNode.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Symbol.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Types.h" 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker namespace sh 17*8975f5c5SAndroid Build Coastguard Worker { 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker constexpr char kAngleInternalPrefix[] = "ANGLE"; 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker // Represents the name of a symbol. 22*8975f5c5SAndroid Build Coastguard Worker class Name 23*8975f5c5SAndroid Build Coastguard Worker { 24*8975f5c5SAndroid Build Coastguard Worker public: 25*8975f5c5SAndroid Build Coastguard Worker constexpr Name(const Name &) = default; 26*8975f5c5SAndroid Build Coastguard Worker Name()27*8975f5c5SAndroid Build Coastguard Worker constexpr Name() : Name(kEmptyImmutableString, SymbolType::Empty) {} 28*8975f5c5SAndroid Build Coastguard Worker Name(ImmutableString rawName,SymbolType symbolType)29*8975f5c5SAndroid Build Coastguard Worker constexpr Name(ImmutableString rawName, SymbolType symbolType) 30*8975f5c5SAndroid Build Coastguard Worker : mRawName(rawName), mSymbolType(symbolType) 31*8975f5c5SAndroid Build Coastguard Worker { 32*8975f5c5SAndroid Build Coastguard Worker ASSERT(rawName.empty() == (symbolType == SymbolType::Empty)); 33*8975f5c5SAndroid Build Coastguard Worker } 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker explicit constexpr Name(const char *rawName, SymbolType symbolType = SymbolType::AngleInternal) Name(ImmutableString (rawName),symbolType)36*8975f5c5SAndroid Build Coastguard Worker : Name(ImmutableString(rawName), symbolType) 37*8975f5c5SAndroid Build Coastguard Worker {} 38*8975f5c5SAndroid Build Coastguard Worker Name(const std::string & rawName,SymbolType symbolType)39*8975f5c5SAndroid Build Coastguard Worker Name(const std::string &rawName, SymbolType symbolType) 40*8975f5c5SAndroid Build Coastguard Worker : Name(ImmutableString(rawName), symbolType) 41*8975f5c5SAndroid Build Coastguard Worker {} 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker explicit Name(const TField &field); 44*8975f5c5SAndroid Build Coastguard Worker explicit Name(const TSymbol &symbol); 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker Name &operator=(const Name &) = default; 47*8975f5c5SAndroid Build Coastguard Worker bool operator==(const Name &other) const; 48*8975f5c5SAndroid Build Coastguard Worker bool operator!=(const Name &other) const; 49*8975f5c5SAndroid Build Coastguard Worker bool operator<(const Name &other) const; 50*8975f5c5SAndroid Build Coastguard Worker rawName()51*8975f5c5SAndroid Build Coastguard Worker constexpr const ImmutableString &rawName() const { return mRawName; } symbolType()52*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolType symbolType() const { return mSymbolType; } 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker bool empty() const; 55*8975f5c5SAndroid Build Coastguard Worker bool beginsWith(const Name &prefix) const; 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker void emit(TInfoSinkBase &out) const; 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker private: 60*8975f5c5SAndroid Build Coastguard Worker ImmutableString mRawName; 61*8975f5c5SAndroid Build Coastguard Worker SymbolType mSymbolType; 62*8975f5c5SAndroid Build Coastguard Worker template <typename T> 63*8975f5c5SAndroid Build Coastguard Worker void emitImpl(T &out) const; 64*8975f5c5SAndroid Build Coastguard Worker friend std::ostream &operator<<(std::ostream &os, const sh::Name &name); 65*8975f5c5SAndroid Build Coastguard Worker }; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker constexpr Name kBaseInstanceName = Name("baseInstance"); 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker [[nodiscard]] bool ExpressionContainsName(const Name &name, TIntermTyped &node); 70*8975f5c5SAndroid Build Coastguard Worker 71*8975f5c5SAndroid Build Coastguard Worker } // namespace sh 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_TRANSLATOR_MSL_NAME_H_ 74