// // 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 : unsigned int { // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf kUnfoldedShortCircuitExpression = 1u << 0u, // Matches expressions that return arrays with the exception of simple statements where a // constructor or function call result is assigned. kExpressionReturningArray = 1u << 1u, // Matches dynamic indexing of vectors or matrices in l-values. kDynamicIndexingOfVectorOrMatrixInLValue = 1u << 2u, // Matches declarations with more than one declared variables. kMultiDeclaration = 1u << 3u, // Matches declarations of arrays. kArrayDeclaration = 1u << 4u, // Matches declarations of structs where the struct type does not have a name. kNamelessStructDeclaration = 1u << 5u, // Matches array length() method. kArrayLengthMethod = 1u << 6u, // Matches a vector or matrix constructor whose arguments are scalarized by the // scalarizeVecOrMatConstructorArguments workaround. kScalarizedVecOrMatConstructor = 1u << 7u, }; IntermNodePatternMatcher(const unsigned int mask); bool match(TIntermUnary *node) const; bool match(TIntermBinary *node, TIntermNode *parentNode) const; // Use this version for checking binary node matches in case you're using flag // kDynamicIndexingOfVectorOrMatrixInLValue. bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere) const; bool match(TIntermAggregate *node, TIntermNode *parentNode) const; bool match(TIntermTernary *node) const; bool match(TIntermDeclaration *node) const; private: const unsigned int mMask; bool matchInternal(TIntermBinary *node, TIntermNode *parentNode) const; }; } // namespace sh #endif // COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_