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