Edit

kc3-lang/angle/src/compiler/depgraph/DependencyGraphOutput.cpp

Branch :

  • Show log

    Commit

  • Author : maxvujovic@gmail.com
    Date : 2012-05-30 22:18:11
    Hash : 66ebd014
    Message : Add the SH_TIMING_RESTRICTIONS compile flag and dependency graph implementation. Description of the algorithm: http://code.google.com/p/mvujovic/wiki/ShaderControlFlowAnalysis This flag is one potential solution to timing attacks on textures containing cross-domain content or user agent data. This kind of analysis could be useful for both WebGL and CSS Shaders. The SH_TIMING_RESTRICTIONS flag will reject a shader if it uses texture dependent data to affect control flow. Other ways of affecting shader timing such as using NaNs in basic arithmetic operations or using built-in functions (e.g. atan) with different inputs are still under investigation. Issue=329 Review URL: http://codereview.appspot.com/6195062/ git-svn-id: https://angleproject.googlecode.com/svn/trunk@1101 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • src/compiler/depgraph/DependencyGraphOutput.cpp
  • //
    // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    #include "compiler/depgraph/DependencyGraphOutput.h"
    
    void TDependencyGraphOutput::outputIndentation()
    {
        for (int i = 0; i < getDepth(); ++i)
            mSink << "  ";
    }
    
    void TDependencyGraphOutput::visitArgument(TGraphArgument* parameter)
    {
        outputIndentation();
        mSink << "argument " << parameter->getArgumentNumber() << " of call to "
              << parameter->getIntermFunctionCall()->getName() << "\n";
    }
    
    void TDependencyGraphOutput::visitFunctionCall(TGraphFunctionCall* functionCall)
    {
        outputIndentation();
        mSink << "function call " <<  functionCall->getIntermFunctionCall()->getName() << "\n";
    }
    
    void TDependencyGraphOutput::visitSymbol(TGraphSymbol* symbol)
    {
        outputIndentation();
        mSink << symbol->getIntermSymbol()->getSymbol() << " (symbol id: "
              << symbol->getIntermSymbol()->getId() << ")\n";
    }
    
    void TDependencyGraphOutput::visitSelection(TGraphSelection* selection)
    {
        outputIndentation();
        mSink << "selection\n";
    }
    
    void TDependencyGraphOutput::visitLoop(TGraphLoop* loop)
    {
        outputIndentation();
        mSink << "loop condition\n";
    }
    
    void TDependencyGraphOutput::visitLogicalOp(TGraphLogicalOp* logicalOp)
    {
        outputIndentation();
        mSink << "logical " << logicalOp->getOpString() << "\n";
    }
    
    void TDependencyGraphOutput::outputAllSpanningTrees(TDependencyGraph& graph)
    {
        mSink << "\n";
    
        for (TGraphNodeVector::const_iterator iter = graph.begin(); iter != graph.end(); ++iter)
        {
            TGraphNode* symbol = *iter;
            mSink << "--- Dependency graph spanning tree ---\n";
            clearVisited();
            symbol->traverse(this);
            mSink << "\n";
        }
    }