Set __VERSION__ macro when the #version directive is parsed

__VERSION__ macro needs to be set to 300 when #version 300 es is on the
first line of the shader, since section 3.4 of ESSL 3.00.4 spec mentions
that the value of __VERSION__ should match the shading language being
parsed. The value from parsing the version directive replaces the default
value 100.

BUG=angleproject:524
TEST=dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.*
     (4 tests start passing, 2 still fail)
     dEQP-GLES3.functional.shaders.preprocessor.conditionals.*
     (2 tests start passing)
     dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.*
     (no regression)

Change-Id: I15bfdeb73d1e343d131ded56b1fd52ca5ef32408
Reviewed-on: https://chromium-review.googlesource.com/293440
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/preprocessor/DirectiveParser.cpp b/src/compiler/preprocessor/DirectiveParser.cpp
index 44cd6ba..7f8f27b 100644
--- a/src/compiler/preprocessor/DirectiveParser.cpp
+++ b/src/compiler/preprocessor/DirectiveParser.cpp
@@ -821,6 +821,7 @@
     {
         mDirectiveHandler->handleVersion(token->location, version);
         mShaderVersion = version;
+        PredefineMacro(mMacroSet, "__VERSION__", version);
     }
 }
 
diff --git a/src/compiler/preprocessor/Macro.cpp b/src/compiler/preprocessor/Macro.cpp
index 13cb14e..4c4d5fd 100644
--- a/src/compiler/preprocessor/Macro.cpp
+++ b/src/compiler/preprocessor/Macro.cpp
@@ -6,6 +6,8 @@
 
 #include "Macro.h"
 
+#include <sstream>
+
 #include "Token.h"
 
 namespace pp
@@ -19,5 +21,23 @@
            (replacements == other.replacements);
 }
 
+void PredefineMacro(MacroSet *macroSet, const char *name, int value)
+{
+    std::ostringstream stream;
+    stream << value;
+
+    Token token;
+    token.type = Token::CONST_INT;
+    token.text = stream.str();
+
+    Macro macro;
+    macro.predefined = true;
+    macro.type       = Macro::kTypeObj;
+    macro.name = name;
+    macro.replacements.push_back(token);
+
+    (*macroSet)[name] = macro;
+}
+
 }  // namespace pp
 
diff --git a/src/compiler/preprocessor/Macro.h b/src/compiler/preprocessor/Macro.h
index 7662a9c..31ee22c 100644
--- a/src/compiler/preprocessor/Macro.h
+++ b/src/compiler/preprocessor/Macro.h
@@ -45,6 +45,8 @@
 
 typedef std::map<std::string, Macro> MacroSet;
 
+void PredefineMacro(MacroSet *macroSet, const char *name, int value);
+
 }  // namespace pp
 
 #endif  // COMPILER_PREPROCESSOR_MACRO_H_
diff --git a/src/compiler/preprocessor/Preprocessor.cpp b/src/compiler/preprocessor/Preprocessor.cpp
index 3522fa1..2850ca1 100644
--- a/src/compiler/preprocessor/Preprocessor.cpp
+++ b/src/compiler/preprocessor/Preprocessor.cpp
@@ -7,7 +7,6 @@
 #include "Preprocessor.h"
 
 #include <cassert>
-#include <sstream>
 
 #include "DiagnosticsBase.h"
 #include "DirectiveParser.h"
@@ -52,12 +51,12 @@
                         const char * const string[],
                         const int length[])
 {
-    static const int kGLSLVersion = 100;
+    static const int kDefaultGLSLVersion = 100;
 
     // Add standard pre-defined macros.
     predefineMacro("__LINE__", 0);
     predefineMacro("__FILE__", 0);
-    predefineMacro("__VERSION__", kGLSLVersion);
+    predefineMacro("__VERSION__", kDefaultGLSLVersion);
     predefineMacro("GL_ES", 1);
 
     return mImpl->tokenizer.init(count, string, length);
@@ -65,20 +64,7 @@
 
 void Preprocessor::predefineMacro(const char *name, int value)
 {
-    std::ostringstream stream;
-    stream << value;
-
-    Token token;
-    token.type = Token::CONST_INT;
-    token.text = stream.str();
-
-    Macro macro;
-    macro.predefined = true;
-    macro.type = Macro::kTypeObj;
-    macro.name = name;
-    macro.replacements.push_back(token);
-
-    mImpl->macroSet[name] = macro;
+    PredefineMacro(&mImpl->macroSet, name, value);
 }
 
 void Preprocessor::lex(Token *token)