Clean up inserting variables to symbol table

This makes the TSymbolTable interface cleaner and prepares for making
unique id counting thread-safe.

BUG=angleproject:624
TEST=angle_unittests

Change-Id: Ief99c9fc777603de28ba1517e351bc8a00633590
Reviewed-on: https://chromium-review.googlesource.com/570418
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/Initialize.cpp b/src/compiler/translator/Initialize.cpp
index 4275837..2f93307 100644
--- a/src/compiler/translator/Initialize.cpp
+++ b/src/compiler/translator/Initialize.cpp
@@ -690,15 +690,10 @@
     fields->push_back(diff);
     TStructure *depthRangeStruct =
         new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields);
-    TVariable *depthRangeParameters =
-        new TVariable(&depthRangeStruct->name(), TType(depthRangeStruct), true);
-    symbolTable.insert(COMMON_BUILTINS, depthRangeParameters);
-    TVariable *depthRange = new TVariable(NewPoolTString("gl_DepthRange"), TType(depthRangeStruct));
-    depthRange->setQualifier(EvqUniform);
-    // Do lazy initialization for depth range, so we allocate to the current scope.
-    depthRangeParameters->getType().realize();
-    depthRange->getType().realize();
-    symbolTable.insert(COMMON_BUILTINS, depthRange);
+    symbolTable.insertStructType(COMMON_BUILTINS, depthRangeStruct);
+    TType depthRangeType(depthRangeStruct);
+    depthRangeType.setQualifier(EvqUniform);
+    symbolTable.insertVariable(COMMON_BUILTINS, "gl_DepthRange", depthRangeType);
 
     //
     // Implementation dependent built-in constants.
@@ -796,34 +791,28 @@
 
     if (resources.OVR_multiview && type != GL_COMPUTE_SHADER)
     {
-        symbolTable.insert(ESSL3_BUILTINS, "GL_OVR_multiview",
-                           new TVariable(NewPoolTString("gl_ViewID_OVR"),
-                                         TType(EbtUInt, EbpHigh, EvqViewIDOVR, 1)));
+        symbolTable.insertVariableExt(ESSL3_BUILTINS, "GL_OVR_multiview", "gl_ViewID_OVR",
+                                      TType(EbtUInt, EbpHigh, EvqViewIDOVR, 1));
 
         // ESSL 1.00 doesn't have unsigned integers, so gl_ViewID_OVR is a signed integer in ESSL
         // 1.00. This is specified in the WEBGL_multiview spec.
-        symbolTable.insert(ESSL1_BUILTINS, "GL_OVR_multiview",
-                           new TVariable(NewPoolTString("gl_ViewID_OVR"),
-                                         TType(EbtInt, EbpHigh, EvqViewIDOVR, 1)));
+        symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_OVR_multiview", "gl_ViewID_OVR",
+                                      TType(EbtInt, EbpHigh, EvqViewIDOVR, 1));
     }
 
     switch (type)
     {
         case GL_FRAGMENT_SHADER:
         {
-            symbolTable.insert(COMMON_BUILTINS,
-                               new TVariable(NewPoolTString("gl_FragCoord"),
-                                             TType(EbtFloat, EbpMedium, EvqFragCoord, 4)));
-            symbolTable.insert(COMMON_BUILTINS,
-                               new TVariable(NewPoolTString("gl_FrontFacing"),
-                                             TType(EbtBool, EbpUndefined, EvqFrontFacing, 1)));
-            symbolTable.insert(COMMON_BUILTINS,
-                               new TVariable(NewPoolTString("gl_PointCoord"),
-                                             TType(EbtFloat, EbpMedium, EvqPointCoord, 2)));
+            symbolTable.insertVariable(COMMON_BUILTINS, "gl_FragCoord",
+                                       TType(EbtFloat, EbpMedium, EvqFragCoord, 4));
+            symbolTable.insertVariable(COMMON_BUILTINS, "gl_FrontFacing",
+                                       TType(EbtBool, EbpUndefined, EvqFrontFacing, 1));
+            symbolTable.insertVariable(COMMON_BUILTINS, "gl_PointCoord",
+                                       TType(EbtFloat, EbpMedium, EvqPointCoord, 2));
 
-            symbolTable.insert(ESSL1_BUILTINS,
-                               new TVariable(NewPoolTString("gl_FragColor"),
-                                             TType(EbtFloat, EbpMedium, EvqFragColor, 4)));
+            symbolTable.insertVariable(ESSL1_BUILTINS, "gl_FragColor",
+                                       TType(EbtFloat, EbpMedium, EvqFragColor, 4));
             TType fragData(EbtFloat, EbpMedium, EvqFragData, 4);
             if (spec != SH_WEBGL2_SPEC && spec != SH_WEBGL3_SPEC)
             {
@@ -833,35 +822,29 @@
             {
                 fragData.setArraySize(1u);
             }
-            symbolTable.insert(ESSL1_BUILTINS,
-                               new TVariable(NewPoolTString("gl_FragData"), fragData));
+            symbolTable.insertVariable(ESSL1_BUILTINS, "gl_FragData", fragData);
 
             if (resources.EXT_blend_func_extended)
             {
-                symbolTable.insert(
-                    ESSL1_BUILTINS, "GL_EXT_blend_func_extended",
-                    new TVariable(NewPoolTString("gl_SecondaryFragColorEXT"),
-                                  TType(EbtFloat, EbpMedium, EvqSecondaryFragColorEXT, 4)));
+                symbolTable.insertVariableExt(
+                    ESSL1_BUILTINS, "GL_EXT_blend_func_extended", "gl_SecondaryFragColorEXT",
+                    TType(EbtFloat, EbpMedium, EvqSecondaryFragColorEXT, 4));
                 TType secondaryFragData(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1, true);
                 secondaryFragData.setArraySize(resources.MaxDualSourceDrawBuffers);
-                symbolTable.insert(
-                    ESSL1_BUILTINS, "GL_EXT_blend_func_extended",
-                    new TVariable(NewPoolTString("gl_SecondaryFragDataEXT"), secondaryFragData));
+                symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_EXT_blend_func_extended",
+                                              "gl_SecondaryFragDataEXT", secondaryFragData);
             }
 
             if (resources.EXT_frag_depth)
             {
-                symbolTable.insert(
-                    ESSL1_BUILTINS, "GL_EXT_frag_depth",
-                    new TVariable(
-                        NewPoolTString("gl_FragDepthEXT"),
-                        TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium,
-                              EvqFragDepthEXT, 1)));
+                symbolTable.insertVariableExt(
+                    ESSL1_BUILTINS, "GL_EXT_frag_depth", "gl_FragDepthEXT",
+                    TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium,
+                          EvqFragDepthEXT, 1));
             }
 
-            symbolTable.insert(ESSL3_BUILTINS,
-                               new TVariable(NewPoolTString("gl_FragDepth"),
-                                             TType(EbtFloat, EbpHigh, EvqFragDepth, 1)));
+            symbolTable.insertVariable(ESSL3_BUILTINS, "gl_FragDepth",
+                                       TType(EbtFloat, EbpHigh, EvqFragDepth, 1));
 
             if (resources.EXT_shader_framebuffer_fetch || resources.NV_shader_framebuffer_fetch)
             {
@@ -870,68 +853,52 @@
 
                 if (resources.EXT_shader_framebuffer_fetch)
                 {
-                    symbolTable.insert(
-                        ESSL1_BUILTINS, "GL_EXT_shader_framebuffer_fetch",
-                        new TVariable(NewPoolTString("gl_LastFragData"), lastFragData));
+                    symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_EXT_shader_framebuffer_fetch",
+                                                  "gl_LastFragData", lastFragData);
                 }
                 else if (resources.NV_shader_framebuffer_fetch)
                 {
-                    symbolTable.insert(
-                        ESSL1_BUILTINS, "GL_NV_shader_framebuffer_fetch",
-                        new TVariable(NewPoolTString("gl_LastFragColor"),
-                                      TType(EbtFloat, EbpMedium, EvqLastFragColor, 4)));
-                    symbolTable.insert(
-                        ESSL1_BUILTINS, "GL_NV_shader_framebuffer_fetch",
-                        new TVariable(NewPoolTString("gl_LastFragData"), lastFragData));
+                    symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_NV_shader_framebuffer_fetch",
+                                                  "gl_LastFragColor",
+                                                  TType(EbtFloat, EbpMedium, EvqLastFragColor, 4));
+                    symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_NV_shader_framebuffer_fetch",
+                                                  "gl_LastFragData", lastFragData);
                 }
             }
             else if (resources.ARM_shader_framebuffer_fetch)
             {
-                symbolTable.insert(ESSL1_BUILTINS, "GL_ARM_shader_framebuffer_fetch",
-                                   new TVariable(NewPoolTString("gl_LastFragColorARM"),
-                                                 TType(EbtFloat, EbpMedium, EvqLastFragColor, 4)));
+                symbolTable.insertVariableExt(ESSL1_BUILTINS, "GL_ARM_shader_framebuffer_fetch",
+                                              "gl_LastFragColorARM",
+                                              TType(EbtFloat, EbpMedium, EvqLastFragColor, 4));
             }
         }
 
         break;
 
         case GL_VERTEX_SHADER:
-            symbolTable.insert(COMMON_BUILTINS,
-                               new TVariable(NewPoolTString("gl_Position"),
-                                             TType(EbtFloat, EbpHigh, EvqPosition, 4)));
-            symbolTable.insert(COMMON_BUILTINS,
-                               new TVariable(NewPoolTString("gl_PointSize"),
-                                             TType(EbtFloat, EbpMedium, EvqPointSize, 1)));
-            symbolTable.insert(ESSL3_BUILTINS,
-                               new TVariable(NewPoolTString("gl_InstanceID"),
-                                             TType(EbtInt, EbpHigh, EvqInstanceID, 1)));
-            symbolTable.insert(ESSL3_BUILTINS,
-                               new TVariable(NewPoolTString("gl_VertexID"),
-                                             TType(EbtInt, EbpHigh, EvqVertexID, 1)));
+            symbolTable.insertVariable(COMMON_BUILTINS, "gl_Position",
+                                       TType(EbtFloat, EbpHigh, EvqPosition, 4));
+            symbolTable.insertVariable(COMMON_BUILTINS, "gl_PointSize",
+                                       TType(EbtFloat, EbpMedium, EvqPointSize, 1));
+            symbolTable.insertVariable(ESSL3_BUILTINS, "gl_InstanceID",
+                                       TType(EbtInt, EbpHigh, EvqInstanceID, 1));
+            symbolTable.insertVariable(ESSL3_BUILTINS, "gl_VertexID",
+                                       TType(EbtInt, EbpHigh, EvqVertexID, 1));
             break;
         case GL_COMPUTE_SHADER:
         {
-            symbolTable.insert(ESSL3_1_BUILTINS,
-                               new TVariable(NewPoolTString("gl_NumWorkGroups"),
-                                             TType(EbtUInt, EbpUndefined, EvqNumWorkGroups, 3)));
-            symbolTable.insert(ESSL3_1_BUILTINS,
-                               new TVariable(NewPoolTString("gl_WorkGroupSize"),
-                                             TType(EbtUInt, EbpUndefined, EvqWorkGroupSize, 3)));
-            symbolTable.insert(ESSL3_1_BUILTINS,
-                               new TVariable(NewPoolTString("gl_WorkGroupID"),
-                                             TType(EbtUInt, EbpUndefined, EvqWorkGroupID, 3)));
-            symbolTable.insert(
-                ESSL3_1_BUILTINS,
-                new TVariable(NewPoolTString("gl_LocalInvocationID"),
-                              TType(EbtUInt, EbpUndefined, EvqLocalInvocationID, 3)));
-            symbolTable.insert(
-                ESSL3_1_BUILTINS,
-                new TVariable(NewPoolTString("gl_GlobalInvocationID"),
-                              TType(EbtUInt, EbpUndefined, EvqGlobalInvocationID, 3)));
-            symbolTable.insert(
-                ESSL3_1_BUILTINS,
-                new TVariable(NewPoolTString("gl_LocalInvocationIndex"),
-                              TType(EbtUInt, EbpUndefined, EvqLocalInvocationIndex, 1)));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_NumWorkGroups",
+                                       TType(EbtUInt, EbpUndefined, EvqNumWorkGroups, 3));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_WorkGroupSize",
+                                       TType(EbtUInt, EbpUndefined, EvqWorkGroupSize, 3));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_WorkGroupID",
+                                       TType(EbtUInt, EbpUndefined, EvqWorkGroupID, 3));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_LocalInvocationID",
+                                       TType(EbtUInt, EbpUndefined, EvqLocalInvocationID, 3));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_GlobalInvocationID",
+                                       TType(EbtUInt, EbpUndefined, EvqGlobalInvocationID, 3));
+            symbolTable.insertVariable(ESSL3_1_BUILTINS, "gl_LocalInvocationIndex",
+                                       TType(EbtUInt, EbpUndefined, EvqLocalInvocationIndex, 1));
         }
         break;