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
diff --git a/src/compiler/timing/RestrictVertexShaderTiming.cpp b/src/compiler/timing/RestrictVertexShaderTiming.cpp
new file mode 100644
index 0000000..220cb49
--- /dev/null
+++ b/src/compiler/timing/RestrictVertexShaderTiming.cpp
@@ -0,0 +1,30 @@
+//
+// 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/timing/RestrictVertexShaderTiming.h"
+
+void RestrictVertexShaderTiming::visitSymbol(TIntermSymbol* node)
+{
+    if (node->getQualifier() == EvqUniform &&
+        node->getBasicType() == EbtSampler2D &&
+        node->getSymbol() == mRestrictedSymbol) {
+        mFoundRestrictedSymbol = true;
+        mSink.prefix(EPrefixError);
+        mSink.location(node->getLine());
+        mSink << "Definition of a uniform sampler2D by the name '" << mRestrictedSymbol
+              << "' is not permitted in vertex shaders.\n";
+    }
+}
+
+bool RestrictVertexShaderTiming::visitAggregate(Visit visit, TIntermAggregate* node)
+{
+    // Don't keep exploring if we've found the restricted symbol, and don't explore anything besides
+    // the global scope (i.e. don't explore function definitions).
+    if (mFoundRestrictedSymbol || node->getOp() == EOpFunction)
+        return false;
+
+    return true;
+}