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:
11 0 : TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
12 : {
13 0 : }
14 :
15 0 : 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 : //
33 0 : bool QualifierWritten(TIntermNode* node, TQualifier qualifier)
34 : {
35 0 : TAliveTraverser it(qualifier);
36 :
37 0 : if (node)
38 0 : node->traverse(&it);
39 :
40 0 : return it.wasFound();
41 : }
42 :
43 0 : void TAliveTraverser::visitSymbol(TIntermSymbol* node)
44 : {
45 : //
46 : // If it's what we're looking for, record it.
47 : //
48 0 : if (node->getQualifier() == qualifier)
49 0 : found = true;
50 0 : }
51 :
52 0 : bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node)
53 : {
54 0 : if (wasFound())
55 0 : return false;
56 :
57 0 : return true;
58 : }
|