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