Split builtin symbols over multiple levels.

Bug 19331817

Change-Id: Ia1ab8f4da90c62ca846961c97691aacdbdf62a6a
Reviewed-on: https://swiftshader-review.googlesource.com/2361
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/SymbolTable.cpp b/src/OpenGL/compiler/SymbolTable.cpp
index d0cd43d..350c184 100644
--- a/src/OpenGL/compiler/SymbolTable.cpp
+++ b/src/OpenGL/compiler/SymbolTable.cpp
@@ -181,6 +181,38 @@
     }
 }
 
+TSymbol *TSymbolTable::find(const TString &name, int shaderVersion, bool *builtIn, bool *sameScope) const
+{
+    int level = currentLevel();
+    TSymbol *symbol = nullptr;
+
+    do
+    {
+        symbol = table[level]->find(name);
+        --level;
+    }
+    while(!symbol && level >= 0);
+
+    level++;
+
+    if(builtIn)
+    {
+        *builtIn = (level == 0);
+    }
+
+    if(sameScope)
+    {
+        *sameScope = (level == currentLevel());
+    }
+
+    return symbol;
+}
+
+TSymbol *TSymbolTable::findBuiltIn(const TString &name, int shaderVersion) const
+{
+    return table[0]->find(name);
+}
+
 TSymbol::TSymbol(const TSymbol& copyOf)
 {
     name = NewPoolTString(copyOf.name->c_str());