14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 7b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h" 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass TAliveTraverser : public TIntermTraverser { 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.compublic: 114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q) 124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com bool wasFound() { return found; } 164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comprotected: 184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com bool found; 194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TQualifier qualifier; 204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com void visitSymbol(TIntermSymbol*); 224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com bool visitSelection(Visit, TIntermSelection*); 234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}; 244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Report whether or not a variable of the given qualifier type 274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// is guaranteed written. Not always possible to determine if 284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// it is written conditionally. 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// ?? It does not do this well yet, this is just a place holder 314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// that simply determines if it was reference at all, anywhere. 324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool QualifierWritten(TIntermNode* node, TQualifier qualifier) 344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TAliveTraverser it(qualifier); 364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (node) 384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com node->traverse(&it); 394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return it.wasFound(); 414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid TAliveTraverser::visitSymbol(TIntermSymbol* node) 444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com // 464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com // If it's what we're looking for, record it. 474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com // 484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (node->getQualifier() == qualifier) 494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com found = true; 504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node) 534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (wasFound()) 554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return false; 564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return true; 584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 59