14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
2298f90764477730a044ba94f233d9a62647f1f1cshannonwoods@chromium.org// Copyright (c) 2002-2013 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
717732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/localintermediate.h"
817732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/SymbolTable.h"
94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Two purposes:
124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1.  Show an example of how to iterate tree.  Functions can
134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//     also directly call Traverse() on children themselves to
144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//     have finer grained control over the process than shown here.
154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//     See the last function for how to get started.
164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2.  Print out a text based description of the tree.
174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use this class to carry along data from node to node in
214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// the traversal
224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass TOutputTraverser : public TIntermTraverser {
244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.compublic:
257beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TOutputTraverser(TInfoSinkBase& i) : sink(i) { }
267beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& sink;
274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comprotected:
2976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    void visitSymbol(TIntermSymbol*);
3076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    void visitConstantUnion(TIntermConstantUnion*);
3176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitBinary(Visit visit, TIntermBinary*);
3276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitUnary(Visit visit, TIntermUnary*);
3376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitSelection(Visit visit, TIntermSelection*);
3476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitAggregate(Visit visit, TIntermAggregate*);
3576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitLoop(Visit visit, TIntermLoop*);
3676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    bool visitBranch(Visit visit, TIntermBranch*);
374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comTString TType::getCompleteString() const
404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
414e4facd4a1120f77e35b53cd4ba7d5a8adefddcfalokp@chromium.org    TStringStream stream;
424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (qualifier != EvqTemporary && qualifier != EvqGlobal)
444e4facd4a1120f77e35b53cd4ba7d5a8adefddcfalokp@chromium.org        stream << getQualifierString() << " " << getPrecisionString() << " ";
4576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (array)
464167cc910276be723901f187dec45d04275abb7edaniel@transgaming.com        stream << "array[" << getArraySize() << "] of ";
4709e0988466ea9f3610dfb406f859b634b8e1e188shannonwoods@chromium.org    if (isMatrix())
4809e0988466ea9f3610dfb406f859b634b8e1e188shannonwoods@chromium.org        stream << getCols() << "X" << getRows() << " matrix of ";
4909e0988466ea9f3610dfb406f859b634b8e1e188shannonwoods@chromium.org    else if (isVector())
5009e0988466ea9f3610dfb406f859b634b8e1e188shannonwoods@chromium.org        stream << getNominalSize() << "-component vector of ";
514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
524e4facd4a1120f77e35b53cd4ba7d5a8adefddcfalokp@chromium.org    stream << getBasicString();
534e4facd4a1120f77e35b53cd4ba7d5a8adefddcfalokp@chromium.org    return stream.str();
544e4facd4a1120f77e35b53cd4ba7d5a8adefddcfalokp@chromium.org}
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Helper functions for printing, not part of traversing.
584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
607beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.orgvoid OutputTreeText(TInfoSinkBase& sink, TIntermNode* node, const int depth)
614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
6276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    int i;
634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
647beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    sink.location(node->getLine());
654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    for (i = 0; i < depth; ++i)
677beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        sink << "  ";
684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// The rest of the file are the traversal functions.  The last one
724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// is the one that starts the traversal.
734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Return true from interior nodes to have the external traversal
754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// continue on to children.  If you process children yourself,
764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// return false.
774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid TOutputTraverser::visitSymbol(TIntermSymbol* node)
804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
817beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    OutputTreeText(sink, node, depth);
824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
837beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    sink << "'" << node->getSymbol() << "' ";
847beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    sink << "(" << node->getCompleteString() << ")\n";
854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
897beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
9076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
9176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
9276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
9376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    switch (node->getOp()) {
947beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAssign:                   out << "move second child to first child";           break;
957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpInitialize:               out << "initialize first child with second child";   break;
967beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAddAssign:                out << "add second child into first child";          break;
977beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSubAssign:                out << "subtract second child into first child";     break;
987beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMulAssign:                out << "multiply second child into first child";     break;
997beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorTimesMatrixAssign:  out << "matrix mult second child into first child";  break;
1007beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorTimesScalarAssign:  out << "vector scale second child into first child"; break;
1017beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMatrixTimesScalarAssign:  out << "matrix scale second child into first child"; break;
1027beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMatrixTimesMatrixAssign:  out << "matrix mult second child into first child"; break;
1037beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpDivAssign:                out << "divide second child into first child";       break;
1047beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpIndexDirect:   out << "direct index";   break;
1057beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpIndexIndirect: out << "indirect index"; break;
1067beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpIndexDirectStruct:   out << "direct index for structure";   break;
1074430b0d31979d8c3993f8da50c2ca84974ebb1fdshannonwoods@chromium.org        case EOpIndexDirectInterfaceBlock: out << "direct index for interface block"; break;
1087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorSwizzle: out << "vector swizzle"; break;
1097beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1107beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAdd:    out << "add";                     break;
1117beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSub:    out << "subtract";                break;
1127beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMul:    out << "component-wise multiply"; break;
1137beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpDiv:    out << "divide";                  break;
1147beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpEqual:            out << "Compare Equal";                 break;
1157beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpNotEqual:         out << "Compare Not Equal";             break;
1167beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLessThan:         out << "Compare Less Than";             break;
1177beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpGreaterThan:      out << "Compare Greater Than";          break;
1187beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLessThanEqual:    out << "Compare Less Than or Equal";    break;
1197beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpGreaterThanEqual: out << "Compare Greater Than or Equal"; break;
1207beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1217beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorTimesScalar: out << "vector-scale";          break;
1227beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorTimesMatrix: out << "vector-times-matrix";   break;
1237beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMatrixTimesVector: out << "matrix-times-vector";   break;
1247beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMatrixTimesScalar: out << "matrix-scale";          break;
1257beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMatrixTimesMatrix: out << "matrix-multiply";       break;
1267beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1277beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLogicalOr:  out << "logical-or";   break;
1287beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLogicalXor: out << "logical-xor"; break;
1297beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLogicalAnd: out << "logical-and"; break;
1307beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        default: out << "<unknown op>";
13176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
13276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
1337beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << " (" << node->getCompleteString() << ")";
13476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
1357beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "\n";
13676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
13776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return true;
1384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
1414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
1427beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
14376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
14476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
14576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
14676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    switch (node->getOp()) {
1477beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpNegative:       out << "Negate value";         break;
14876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        case EOpVectorLogicalNot:
1497beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLogicalNot:     out << "Negate conditional";   break;
1507beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1517beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpPostIncrement:  out << "Post-Increment";       break;
1527beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpPostDecrement:  out << "Post-Decrement";       break;
1537beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpPreIncrement:   out << "Pre-Increment";        break;
1547beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpPreDecrement:   out << "Pre-Decrement";        break;
1557beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1567beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvIntToBool:  out << "Convert int to bool";  break;
157ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConvUIntToBool: out << "Convert uint to bool"; break;
1587beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvFloatToBool:out << "Convert float to bool";break;
1597beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvBoolToFloat:out << "Convert bool to float";break;
1607beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvIntToFloat: out << "Convert int to float"; break;
161ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConvUIntToFloat:out << "Convert uint to float";break;
1627beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvFloatToInt: out << "Convert float to int"; break;
1637beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConvBoolToInt:  out << "Convert bool to int";  break;
164ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConvIntToUInt:  out << "Convert int to uint";  break;
165ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConvFloatToUInt:out << "Convert float to uint";break;
166ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConvBoolToUInt: out << "Convert bool to uint"; break;
1677beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1687beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpRadians:        out << "radians";              break;
1697beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpDegrees:        out << "degrees";              break;
1707beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSin:            out << "sine";                 break;
1717beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpCos:            out << "cosine";               break;
1727beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpTan:            out << "tangent";              break;
1737beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAsin:           out << "arc sine";             break;
1747beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAcos:           out << "arc cosine";           break;
1757beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAtan:           out << "arc tangent";          break;
1767beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1777beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpExp:            out << "exp";                  break;
1787beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLog:            out << "log";                  break;
1797beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpExp2:           out << "exp2";                 break;
1807beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLog2:           out << "log2";                 break;
1817beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSqrt:           out << "sqrt";                 break;
1827beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpInverseSqrt:    out << "inverse sqrt";         break;
1837beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1847beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAbs:            out << "Absolute value";       break;
1857beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSign:           out << "Sign";                 break;
1867beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpFloor:          out << "Floor";                break;
1877beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpCeil:           out << "Ceiling";              break;
1887beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpFract:          out << "Fraction";             break;
1897beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1907beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLength:         out << "length";               break;
1917beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpNormalize:      out << "normalize";            break;
1927beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org            //	case EOpDPdx:           out << "dPdx";                 break;
1937beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org            //	case EOpDPdy:           out << "dPdy";                 break;
1947beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org            //	case EOpFwidth:         out << "fwidth";               break;
1957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
1967beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAny:            out << "any";                  break;
1977beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAll:            out << "all";                  break;
1987beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
199075edd84dd682b91279132317d34b09e8028ae6fJamie Madill        default:
200075edd84dd682b91279132317d34b09e8028ae6fJamie Madill            out.prefix(EPrefixError);
201075edd84dd682b91279132317d34b09e8028ae6fJamie Madill            out << "Bad unary op";
20276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
20376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
2047beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << " (" << node->getCompleteString() << ")";
20576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
2067beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "\n";
20776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
20876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return true;
2094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
2124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2137beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
21476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
21576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getOp() == EOpNull) {
216075edd84dd682b91279132317d34b09e8028ae6fJamie Madill        out.prefix(EPrefixError);
217075edd84dd682b91279132317d34b09e8028ae6fJamie Madill        out << "node is still EOpNull!";
21876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        return true;
21976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
22076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
22176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
22276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
22376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    switch (node->getOp()) {
2247beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSequence:      out << "Sequence\n"; return true;
2257beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpComma:         out << "Comma\n"; return true;
2267beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpFunction:      out << "Function Definition: " << node->getName(); break;
2277beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpFunctionCall:  out << "Function Call: " << node->getName(); break;
2287beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpParameters:    out << "Function Parameters: ";              break;
2297beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2307beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructFloat: out << "Construct float"; break;
2317beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructVec2:  out << "Construct vec2";  break;
2327beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructVec3:  out << "Construct vec3";  break;
2337beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructVec4:  out << "Construct vec4";  break;
2347beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructBool:  out << "Construct bool";  break;
2357beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructBVec2: out << "Construct bvec2"; break;
2367beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructBVec3: out << "Construct bvec3"; break;
2377beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructBVec4: out << "Construct bvec4"; break;
2387beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructInt:   out << "Construct int";   break;
2397beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructIVec2: out << "Construct ivec2"; break;
2407beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructIVec3: out << "Construct ivec3"; break;
2417beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructIVec4: out << "Construct ivec4"; break;
242ab60b9346ee79d02433348632fa04b636f0a3fe6Nicolas Capens        case EOpConstructUInt:  out << "Construct uint";  break;
243c0f7c61980ebe66cb6493bf7616a4379f4ddda0aNicolas Capens        case EOpConstructUVec2: out << "Construct uvec2"; break;
244c0f7c61980ebe66cb6493bf7616a4379f4ddda0aNicolas Capens        case EOpConstructUVec3: out << "Construct uvec3"; break;
245c0f7c61980ebe66cb6493bf7616a4379f4ddda0aNicolas Capens        case EOpConstructUVec4: out << "Construct uvec4"; break;
2467beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructMat2:  out << "Construct mat2";  break;
2477beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructMat3:  out << "Construct mat3";  break;
2487beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructMat4:  out << "Construct mat4";  break;
2497beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpConstructStruct:  out << "Construct structure";  break;
2507beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2517beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLessThan:         out << "Compare Less Than";             break;
2527beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpGreaterThan:      out << "Compare Greater Than";          break;
2537beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpLessThanEqual:    out << "Compare Less Than or Equal";    break;
2547beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpGreaterThanEqual: out << "Compare Greater Than or Equal"; break;
2557beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorEqual:      out << "Equal";                         break;
2567beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpVectorNotEqual:   out << "NotEqual";                      break;
2577beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2587beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMod:           out << "mod";         break;
2597beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpPow:           out << "pow";         break;
2607beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2617beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpAtan:          out << "arc tangent"; break;
2627beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2637beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMin:           out << "min";         break;
2647beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMax:           out << "max";         break;
2657beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpClamp:         out << "clamp";       break;
2667beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMix:           out << "mix";         break;
2677beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpStep:          out << "step";        break;
2687beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpSmoothStep:    out << "smoothstep";  break;
2697beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
2707beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpDistance:      out << "distance";                break;
2717beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpDot:           out << "dot-product";             break;
2727beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpCross:         out << "cross-product";           break;
2737beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpFaceForward:   out << "face-forward";            break;
2747beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpReflect:       out << "reflect";                 break;
2757beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpRefract:       out << "refract";                 break;
2767beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpMul:           out << "component-wise multiply"; break;
2777beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org
278a9ae4aa9b632796169c0ced99cff3f1db4801aabdaniel@transgaming.com        case EOpDeclaration:   out << "Declaration: ";   break;
279a9ae4aa9b632796169c0ced99cff3f1db4801aabdaniel@transgaming.com
280075edd84dd682b91279132317d34b09e8028ae6fJamie Madill        default:
281075edd84dd682b91279132317d34b09e8028ae6fJamie Madill            out.prefix(EPrefixError);
282075edd84dd682b91279132317d34b09e8028ae6fJamie Madill            out << "Bad aggregation op";
28376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
28476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
28576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getOp() != EOpSequence && node->getOp() != EOpParameters)
2867beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << " (" << node->getCompleteString() << ")";
28776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
2887beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "\n";
28976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
29076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return true;
2914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitSelection(Visit visit, TIntermSelection* node)
2944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
2957beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
2964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
29776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
2984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2997beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "Test condition and select";
3007beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << " (" << node->getCompleteString() << ")\n";
3014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
30276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    ++depth;
3034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3047beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    OutputTreeText(sink, node, depth);
3057beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "Condition\n";
30676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    node->getCondition()->traverse(this);
3074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    OutputTreeText(sink, node, depth);
30976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getTrueBlock()) {
3107beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "true case\n";
31176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        node->getTrueBlock()->traverse(this);
31276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    } else
3137beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "true case is null\n";
3144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
31576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getFalseBlock()) {
3167beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        OutputTreeText(sink, node, depth);
3177beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "false case\n";
31876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        node->getFalseBlock()->traverse(this);
31976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
3204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
32176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    --depth;
3224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
32376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return false;
3244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
3254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid TOutputTraverser::visitConstantUnion(TIntermConstantUnion* node)
3274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
3287beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
32976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
33094bf7f228d5a2f153ae9cb808f65ef9fbaa4005fJamie Madill    size_t size = node->getType().getObjectSize();
33176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
33294bf7f228d5a2f153ae9cb808f65ef9fbaa4005fJamie Madill    for (size_t i = 0; i < size; i++) {
33376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        OutputTreeText(out, node, depth);
33476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        switch (node->getUnionArrayPointer()[i].getType()) {
33576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org            case EbtBool:
33676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                if (node->getUnionArrayPointer()[i].getBConst())
3377beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                    out << "true";
33876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                else
3397beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                    out << "false";
34076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
3417beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << " (" << "const bool" << ")";
3427beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << "\n";
34376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                break;
34476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org            case EbtFloat:
3457beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << node->getUnionArrayPointer()[i].getFConst();
3467beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << " (const float)\n";
34776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                break;
34876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org            case EbtInt:
3497beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << node->getUnionArrayPointer()[i].getIConst();
3507beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org                out << " (const int)\n";
35176b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                break;
3526b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org            case EbtUInt:
3536b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org                out << node->getUnionArrayPointer()[i].getUConst();
3546b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org                out << " (const uint)\n";
3556b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org                break;
35676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org            default:
357075edd84dd682b91279132317d34b09e8028ae6fJamie Madill                out.message(EPrefixInternalError, node->getLine(), "Unknown constant");
35876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org                break;
35976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        }
36076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
3614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
3624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitLoop(Visit visit, TIntermLoop* node)
3644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
3657beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
3664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
36776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
3684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3697beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "Loop with condition ";
37052813558747eae47cf1514396e450eb3bada12c7alokp@chromium.org    if (node->getType() == ELoopDoWhile)
3717beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "not ";
3727beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    out << "tested first\n";
3734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
37476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    ++depth;
3754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3767beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    OutputTreeText(sink, node, depth);
37752813558747eae47cf1514396e450eb3bada12c7alokp@chromium.org    if (node->getCondition()) {
3787beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "Loop Condition\n";
37952813558747eae47cf1514396e450eb3bada12c7alokp@chromium.org        node->getCondition()->traverse(this);
38076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    } else
3817beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "No loop condition\n";
3824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
3837beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    OutputTreeText(sink, node, depth);
38476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getBody()) {
3857beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "Loop Body\n";
38676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        node->getBody()->traverse(this);
38776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    } else
3887beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "No loop body\n";
3894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
39052813558747eae47cf1514396e450eb3bada12c7alokp@chromium.org    if (node->getExpression()) {
3917beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        OutputTreeText(sink, node, depth);
3927beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "Loop Terminal Expression\n";
39352813558747eae47cf1514396e450eb3bada12c7alokp@chromium.org        node->getExpression()->traverse(this);
39476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
3954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
39676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    --depth;
3974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
39876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return false;
3994f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
4004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool TOutputTraverser::visitBranch(Visit visit, TIntermBranch* node)
4024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
4037beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TInfoSinkBase& out = sink;
40476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
40576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    OutputTreeText(out, node, depth);
40676b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
40776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    switch (node->getFlowOp()) {
4087beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpKill:      out << "Branch: Kill";           break;
4097beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpBreak:     out << "Branch: Break";          break;
4107beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpContinue:  out << "Branch: Continue";       break;
4117beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        case EOpReturn:    out << "Branch: Return";         break;
4127beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        default:           out << "Branch: Unknown Branch"; break;
41376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    }
41476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
41576b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (node->getExpression()) {
4167beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << " with expression\n";
41776b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        ++depth;
41876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        node->getExpression()->traverse(this);
41976b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        --depth;
42076b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    } else
4217beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org        out << "\n";
42276b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org
42376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    return false;
4244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
4254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
4274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// This function is the one to call externally to start the traversal.
4284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Individual functions can be initialized to 0 to skip processing of that
4294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// type of node.  It's children will still be processed.
4304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
4314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid TIntermediate::outputTree(TIntermNode* root)
4324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
43376b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    if (root == 0)
43476b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org        return;
4354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4367beea4084f47ae019b5a93b03a5136c9265dc444alokp@chromium.org    TOutputTraverser it(infoSink.info);
4374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
43876b820852b116d79187e5af5457a45065f656bdaalokp@chromium.org    root->traverse(&it);
4394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
440