• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 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 // IntermNodePatternMatcher is a helper class for matching node trees to given patterns.
7 // It can be used whenever the same checks for certain node structures are common to multiple AST
8 // traversers.
9 //
10 
11 #ifndef COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_
12 #define COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_
13 
14 namespace sh
15 {
16 
17 class TIntermAggregate;
18 class TIntermBinary;
19 class TIntermDeclaration;
20 class TIntermNode;
21 class TIntermTernary;
22 class TIntermUnary;
23 
24 class IntermNodePatternMatcher
25 {
26   public:
27     static bool IsDynamicIndexingOfNonSSBOVectorOrMatrix(TIntermBinary *node);
28     static bool IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node);
29 
30     enum PatternType
31     {
32         // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf
33         kUnfoldedShortCircuitExpression = 0x0001,
34 
35         // Matches expressions that return arrays with the exception of simple statements where a
36         // constructor or function call result is assigned.
37         kExpressionReturningArray = 0x0001 << 1,
38 
39         // Matches dynamic indexing of vectors or matrices in l-values.
40         kDynamicIndexingOfVectorOrMatrixInLValue = 0x0001 << 2,
41 
42         // Matches declarations with more than one declared variables.
43         kMultiDeclaration = 0x0001 << 3,
44 
45         // Matches declarations of arrays.
46         kArrayDeclaration = 0x0001 << 4,
47 
48         // Matches declarations of structs where the struct type does not have a name.
49         kNamelessStructDeclaration = 0x0001 << 5,
50 
51         // Matches array length() method.
52         kArrayLengthMethod = 0x0001 << 6,
53 
54         // Matches a vector or matrix constructor whose arguments are scalarized by the
55         // SH_SCALARIZE_VEC_OR_MAT_CONSTRUCTOR_ARGUMENTS workaround.
56         kScalarizedVecOrMatConstructor = 0x0001 << 7
57     };
58     IntermNodePatternMatcher(const unsigned int mask);
59 
60     bool match(TIntermUnary *node);
61 
62     bool match(TIntermBinary *node, TIntermNode *parentNode);
63 
64     // Use this version for checking binary node matches in case you're using flag
65     // kDynamicIndexingOfVectorOrMatrixInLValue.
66     bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere);
67 
68     bool match(TIntermAggregate *node, TIntermNode *parentNode);
69     bool match(TIntermTernary *node);
70     bool match(TIntermDeclaration *node);
71 
72   private:
73     const unsigned int mMask;
74 
75     bool matchInternal(TIntermBinary *node, TIntermNode *parentNode);
76 };
77 
78 }  // namespace sh
79 
80 #endif  // COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_
81