• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2002-2010 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 
7 #include "compiler/intermediate.h"
8 
9 class TAliveTraverser : public TIntermTraverser {
10 public:
TAliveTraverser(TQualifier q)11     TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
12     {
13     }
14 
wasFound()15 	bool wasFound() { return found; }
16 
17 protected:
18     bool found;
19     TQualifier qualifier;
20 
21     void visitSymbol(TIntermSymbol*);
22     bool visitSelection(Visit, TIntermSelection*);
23 };
24 
25 //
26 // Report whether or not a variable of the given qualifier type
27 // is guaranteed written.  Not always possible to determine if
28 // it is written conditionally.
29 //
30 // ?? It does not do this well yet, this is just a place holder
31 // that simply determines if it was reference at all, anywhere.
32 //
QualifierWritten(TIntermNode * node,TQualifier qualifier)33 bool QualifierWritten(TIntermNode* node, TQualifier qualifier)
34 {
35     TAliveTraverser it(qualifier);
36 
37     if (node)
38         node->traverse(&it);
39 
40     return it.wasFound();
41 }
42 
visitSymbol(TIntermSymbol * node)43 void TAliveTraverser::visitSymbol(TIntermSymbol* node)
44 {
45     //
46     // If it's what we're looking for, record it.
47     //
48     if (node->getQualifier() == qualifier)
49         found = true;
50 }
51 
visitSelection(Visit preVisit,TIntermSelection * node)52 bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node)
53 {
54     if (wasFound())
55         return false;
56 
57     return true;
58 }
59