Store symbol names as a ImmutableString

This will enable compile-time initialization of built-in symbols as
well as reducing copying strings.

Most of the code that deals with names is changed to use
ImmutableString where it makes sense to avoid conversions.

The lexer/parser now allocate const char pointers into pool memory
instead of allocating TStrings. These are then converted to
ImmutableString upon entering TParseContext.

BUG=angleproject:2267
TEST=angle_unittests, angle_end2end_tests

Change-Id: I244d6271ea1ecf7150d4f89dfa388a7745a1150c
Reviewed-on: https://chromium-review.googlesource.com/881561
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/UseInterfaceBlockFields.cpp b/src/compiler/translator/UseInterfaceBlockFields.cpp
index 40bd42a..df0c2f9 100644
--- a/src/compiler/translator/UseInterfaceBlockFields.cpp
+++ b/src/compiler/translator/UseInterfaceBlockFields.cpp
@@ -43,9 +43,8 @@
                            TIntermSequence *sequence,
                            const TSymbolTable &symbolTable)
 {
-    TString name = TString(var.name.c_str());
-    ASSERT(name.find_last_of('[') == TString::npos);
-    TIntermSymbol *symbol = ReferenceGlobalVariable(name, symbolTable);
+    ASSERT(var.name.find_last_of('[') == TString::npos);
+    TIntermSymbol *symbol = ReferenceGlobalVariable(ImmutableString(var.name), symbolTable);
     AddNodeUseStatements(symbol, sequence);
 }
 
@@ -74,8 +73,8 @@
         }
         else if (block.arraySize > 0u)
         {
-            TString name(block.instanceName.c_str());
-            TIntermSymbol *arraySymbol = ReferenceGlobalVariable(name, symbolTable);
+            TIntermSymbol *arraySymbol =
+                ReferenceGlobalVariable(ImmutableString(block.instanceName), symbolTable);
             for (unsigned int i = 0u; i < block.arraySize; ++i)
             {
                 TIntermBinary *elementSymbol =
@@ -85,8 +84,8 @@
         }
         else
         {
-            TString name(block.instanceName.c_str());
-            TIntermSymbol *blockSymbol = ReferenceGlobalVariable(name, symbolTable);
+            TIntermSymbol *blockSymbol =
+                ReferenceGlobalVariable(ImmutableString(block.instanceName), symbolTable);
             InsertUseCode(block, blockSymbol, sequence);
         }
     }