Make unique id counter a member of TSymbolTable

This makes unique id counting thread-safe.

BUG=angleproject:624
TEST=angle_unittests

Change-Id: Ie0f2c7e574470b39750d37d2181c790bc874b275
Reviewed-on: https://chromium-review.googlesource.com/570419
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/RemoveDynamicIndexing.cpp b/src/compiler/translator/RemoveDynamicIndexing.cpp
index 06d77ca..b0c0fde 100644
--- a/src/compiler/translator/RemoveDynamicIndexing.cpp
+++ b/src/compiler/translator/RemoveDynamicIndexing.cpp
@@ -291,7 +291,7 @@
 class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
 {
   public:
-    RemoveDynamicIndexingTraverser(const TSymbolTable &symbolTable, int shaderVersion);
+    RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable, int shaderVersion);
 
     bool visitBinary(Visit visit, TIntermBinary *node) override;
 
@@ -305,8 +305,8 @@
     // Maps of types that are indexed to the indexing function ids used for them. Note that these
     // can not store multiple variants of the same type with different precisions - only one
     // precision gets stored.
-    std::map<TType, TSymbolUniqueId> mIndexedVecAndMatrixTypes;
-    std::map<TType, TSymbolUniqueId> mWrittenVecAndMatrixTypes;
+    std::map<TType, TSymbolUniqueId *> mIndexedVecAndMatrixTypes;
+    std::map<TType, TSymbolUniqueId *> mWrittenVecAndMatrixTypes;
 
     bool mUsedTreeInsertion;
 
@@ -317,7 +317,7 @@
     bool mRemoveIndexSideEffectsInSubtree;
 };
 
-RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser(const TSymbolTable &symbolTable,
+RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable,
                                                                int shaderVersion)
     : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
       mUsedTreeInsertion(false),
@@ -332,11 +332,11 @@
     TIntermSequence insertions;
     for (auto &type : mIndexedVecAndMatrixTypes)
     {
-        insertions.push_back(GetIndexFunctionDefinition(type.first, false, type.second));
+        insertions.push_back(GetIndexFunctionDefinition(type.first, false, *type.second));
     }
     for (auto &type : mWrittenVecAndMatrixTypes)
     {
-        insertions.push_back(GetIndexFunctionDefinition(type.first, true, type.second));
+        insertions.push_back(GetIndexFunctionDefinition(type.first, true, *type.second));
     }
     mInsertions.push_back(NodeInsertMultipleEntry(rootBlock, 0, insertions, TIntermSequence()));
 }
@@ -417,7 +417,7 @@
 #endif
 
             const TType &type = node->getLeft()->getType();
-            TSymbolUniqueId indexingFunctionId;
+            TSymbolUniqueId *indexingFunctionId = new TSymbolUniqueId(mSymbolTable);
             if (mIndexedVecAndMatrixTypes.find(type) == mIndexedVecAndMatrixTypes.end())
             {
                 mIndexedVecAndMatrixTypes[type] = indexingFunctionId;
@@ -459,7 +459,7 @@
                 // TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value
                 // only writes it and doesn't need the previous value. http://anglebug.com/1116
 
-                TSymbolUniqueId indexedWriteFunctionId;
+                TSymbolUniqueId *indexedWriteFunctionId = new TSymbolUniqueId(mSymbolTable);
                 if (mWrittenVecAndMatrixTypes.find(type) == mWrittenVecAndMatrixTypes.end())
                 {
                     mWrittenVecAndMatrixTypes[type] = indexedWriteFunctionId;
@@ -484,14 +484,14 @@
                 TIntermSymbol *tempIndex = createTempSymbol(indexInitializer->getType());
 
                 TIntermAggregate *indexingCall =
-                    CreateIndexFunctionCall(node, tempIndex, indexingFunctionId);
+                    CreateIndexFunctionCall(node, tempIndex, *indexingFunctionId);
 
                 nextTemporaryId();  // From now on, creating temporary symbols that refer to the
                                     // field value.
                 insertionsBefore.push_back(createTempInitDeclaration(indexingCall));
 
                 TIntermAggregate *indexedWriteCall = CreateIndexedWriteFunctionCall(
-                    node, tempIndex, createTempSymbol(fieldType), indexedWriteFunctionId);
+                    node, tempIndex, createTempSymbol(fieldType), *indexedWriteFunctionId);
                 insertionsAfter.push_back(indexedWriteCall);
                 insertStatementsInParentBlock(insertionsBefore, insertionsAfter);
                 queueReplacement(createTempSymbol(fieldType), OriginalNode::IS_DROPPED);
@@ -506,7 +506,7 @@
                 // If the index_expr is unsigned, we'll convert it to signed.
                 ASSERT(!mRemoveIndexSideEffectsInSubtree);
                 TIntermAggregate *indexingCall = CreateIndexFunctionCall(
-                    node, EnsureSignedInt(node->getRight()), indexingFunctionId);
+                    node, EnsureSignedInt(node->getRight()), *indexingFunctionId);
                 queueReplacement(indexingCall, OriginalNode::IS_DROPPED);
             }
         }
@@ -523,14 +523,9 @@
 
 }  // namespace
 
-void RemoveDynamicIndexing(TIntermNode *root,
-                           TSymbolUniqueId *temporaryId,
-                           const TSymbolTable &symbolTable,
-                           int shaderVersion)
+void RemoveDynamicIndexing(TIntermNode *root, TSymbolTable *symbolTable, int shaderVersion)
 {
     RemoveDynamicIndexingTraverser traverser(symbolTable, shaderVersion);
-    ASSERT(temporaryId != nullptr);
-    traverser.useTemporaryId(temporaryId);
     do
     {
         traverser.nextIteration();