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 9class TAliveTraverser : public TIntermTraverser { 10public: 11 TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q) 12 { 13 } 14 15 bool wasFound() { return found; } 16 17protected: 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// 33bool 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 43void 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 52bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node) 53{ 54 if (wasFound()) 55 return false; 56 57 return true; 58} 59