| // | |
| // Copyright 2016 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // IntermNodePatternMatcher is a helper class for matching node trees to given patterns. | |
| // It can be used whenever the same checks for certain node structures are common to multiple AST | |
| // traversers. | |
| // | |
| #ifndef COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_ | |
| #define COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_ | |
| namespace sh | |
| { | |
| class TIntermAggregate; | |
| class TIntermBinary; | |
| class TIntermDeclaration; | |
| class TIntermNode; | |
| class TIntermTernary; | |
| class TIntermUnary; | |
| class IntermNodePatternMatcher | |
| { | |
| public: | |
| static bool IsDynamicIndexingOfNonSSBOVectorOrMatrix(TIntermBinary *node); | |
| static bool IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node); | |
| static bool IsDynamicIndexingOfSwizzledVector(TIntermBinary *node); | |
| enum PatternType | |
| { | |
| // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf | |
| kUnfoldedShortCircuitExpression = 0x0001, | |
| // Matches expressions that return arrays with the exception of simple statements where a | |
| // constructor or function call result is assigned. | |
| kExpressionReturningArray = 0x0001 << 1, | |
| // Matches dynamic indexing of vectors or matrices in l-values. | |
| kDynamicIndexingOfVectorOrMatrixInLValue = 0x0001 << 2, | |
| // Matches declarations with more than one declared variables. | |
| kMultiDeclaration = 0x0001 << 3, | |
| // Matches declarations of arrays. | |
| kArrayDeclaration = 0x0001 << 4, | |
| // Matches declarations of structs where the struct type does not have a name. | |
| kNamelessStructDeclaration = 0x0001 << 5, | |
| // Matches array length() method. | |
| kArrayLengthMethod = 0x0001 << 6, | |
| // Matches a vector or matrix constructor whose arguments are scalarized by the | |
| // SH_SCALARIZE_VEC_OR_MAT_CONSTRUCTOR_ARGUMENTS workaround. | |
| kScalarizedVecOrMatConstructor = 0x0001 << 7 | |
| }; | |
| IntermNodePatternMatcher(const unsigned int mask); | |
| bool match(TIntermUnary *node); | |
| bool match(TIntermBinary *node, TIntermNode *parentNode); | |
| // Use this version for checking binary node matches in case you're using flag | |
| // kDynamicIndexingOfVectorOrMatrixInLValue. | |
| bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere); | |
| bool match(TIntermAggregate *node, TIntermNode *parentNode); | |
| bool match(TIntermTernary *node); | |
| bool match(TIntermDeclaration *node); | |
| private: | |
| const unsigned int mMask; | |
| bool matchInternal(TIntermBinary *node, TIntermNode *parentNode); | |
| }; | |
| } // namespace sh | |
| #endif // COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_ |