Home | History | Annotate | Download | only in compiler
      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     TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
     12     {
     13     }
     14 
     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 //
     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 
     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 
     52 bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node)
     53 {
     54     if (wasFound())
     55         return false;
     56 
     57     return true;
     58 }
     59