From 7d079fd7802763efd8c2d8856117b5df0b3a14e4 Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Mon, 17 Jan 2005 16:01:49 +0000 Subject: 2005-oct-19 3dlabs slang compiler, tweaked a little bit --- .../slang/MachineIndependent/QualifierAlive.cpp | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 src/mesa/shader/slang/MachineIndependent/QualifierAlive.cpp (limited to 'src/mesa/shader/slang/MachineIndependent/QualifierAlive.cpp') diff --git a/src/mesa/shader/slang/MachineIndependent/QualifierAlive.cpp b/src/mesa/shader/slang/MachineIndependent/QualifierAlive.cpp new file mode 100755 index 0000000000..d7846e0ddb --- /dev/null +++ b/src/mesa/shader/slang/MachineIndependent/QualifierAlive.cpp @@ -0,0 +1,91 @@ +// +//Copyright (C) 2002-2004 3Dlabs Inc. Ltd. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// + +#include "../Include/intermediate.h" + +class TAliveTraverser : public TIntermTraverser { +public: + TAliveTraverser(TQualifier q) : TIntermTraverser(), found(false), qualifier(q) + { + visitSymbol = AliveSymbol; + visitSelection = AliveSelection; + rightToLeft = true; + } + bool wasFound() { return found; } +protected: + bool found; + TQualifier qualifier; + + friend void AliveSymbol(TIntermSymbol*, TIntermTraverser*); + friend bool AliveSelection(bool, TIntermSelection*, TIntermTraverser*); +}; + +// +// Report whether or not a variable of the given qualifier type +// is guaranteed written. Not always possible to determine if +// it is written conditionally. +// +// ?? It does not do this well yet, this is just a place holder +// that simply determines if it was reference at all, anywhere. +// +bool QualifierWritten(TIntermNode* node, TQualifier qualifier) +{ + TAliveTraverser it(qualifier); + + if (node) + node->traverse(&it); + + return it.wasFound(); +} + +void AliveSymbol(TIntermSymbol* node, TIntermTraverser* it) +{ + TAliveTraverser* lit = static_cast(it); + + // + // If it's what we're looking for, record it. + // + if (node->getQualifier() == lit->qualifier) + lit->found = true; +} + +bool AliveSelection(bool preVisit, TIntermSelection* node, TIntermTraverser* it) +{ + TAliveTraverser* lit = static_cast(it); + + if (lit->wasFound()) + return false; + + return true; +} -- cgit v1.2.3