Commit 065aa863 by Olli Etuaho Committed by Commit Bot

Generate code for unmangled name lookup

Instead of using an std::map at each symbol table level, use the gen_builtin_symbols.py script to build a function to query unmangled names. BUG=angleproject:2267 TEST=angle_unittests Change-Id: I4f1cf1df1f50fe9d909f3249150ee002ee6efb61 Reviewed-on: https://chromium-review.googlesource.com/931885 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 8f184ae9
...@@ -153,6 +153,7 @@ generators = { ...@@ -153,6 +153,7 @@ generators = {
], ],
'outputs': [ 'outputs': [
'src/compiler/translator/SymbolTable_autogen.cpp', 'src/compiler/translator/SymbolTable_autogen.cpp',
'tests/compiler_tests/ImmutableString_test_autogen.cpp',
], ],
'script': 'src/compiler/translator/gen_builtin_symbols.py', 'script': 'src/compiler/translator/gen_builtin_symbols.py',
}, },
......
...@@ -63,23 +63,15 @@ class TSymbolTable::TSymbolTableBuiltInLevel ...@@ -63,23 +63,15 @@ class TSymbolTable::TSymbolTableBuiltInLevel
public: public:
TSymbolTableBuiltInLevel() = default; TSymbolTableBuiltInLevel() = default;
bool insert(const TSymbol *symbol); void insert(const TSymbol *symbol);
const TSymbol *find(const ImmutableString &name) const; const TSymbol *find(const ImmutableString &name) const;
void insertUnmangledBuiltIn(const ImmutableString &name, TExtension ext);
const UnmangledBuiltIn *getUnmangledBuiltIn(const ImmutableString &name) const;
private: private:
using tLevel = TUnorderedMap<ImmutableString, using tLevel = TUnorderedMap<ImmutableString,
const TSymbol *, const TSymbol *,
ImmutableString::FowlerNollVoHash<sizeof(size_t)>>; ImmutableString::FowlerNollVoHash<sizeof(size_t)>>;
using tLevelPair = const tLevel::value_type; using tLevelPair = const tLevel::value_type;
using tInsertResult = std::pair<tLevel::iterator, bool>;
tLevel mLevel; tLevel mLevel;
std::map<ImmutableString, UnmangledBuiltIn> mUnmangledBuiltIns;
}; };
bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol) bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol)
...@@ -103,11 +95,9 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons ...@@ -103,11 +95,9 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons
return (*it).second; return (*it).second;
} }
bool TSymbolTable::TSymbolTableBuiltInLevel::insert(const TSymbol *symbol) void TSymbolTable::TSymbolTableBuiltInLevel::insert(const TSymbol *symbol)
{ {
// returning true means symbol was added to the table mLevel.insert(tLevelPair(symbol->getMangledName(), symbol));
tInsertResult result = mLevel.insert(tLevelPair(symbol->getMangledName(), symbol));
return result.second;
} }
const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableString &name) const const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableString &name) const
...@@ -119,27 +109,8 @@ const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableStrin ...@@ -119,27 +109,8 @@ const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableStrin
return (*it).second; return (*it).second;
} }
void TSymbolTable::TSymbolTableBuiltInLevel::insertUnmangledBuiltIn(const ImmutableString &name, TSymbolTable::TSymbolTable()
TExtension ext) : mUniqueIdCounter(0), mUserDefinedUniqueIdsStart(-1), mShaderType(GL_FRAGMENT_SHADER)
{
if (ext == TExtension::UNDEFINED || mUnmangledBuiltIns.find(name) == mUnmangledBuiltIns.end())
{
mUnmangledBuiltIns[name] = UnmangledBuiltIn(ext);
}
}
const UnmangledBuiltIn *TSymbolTable::TSymbolTableBuiltInLevel::getUnmangledBuiltIn(
const ImmutableString &name) const
{
auto it = mUnmangledBuiltIns.find(ImmutableString(name));
if (it == mUnmangledBuiltIns.end())
{
return nullptr;
}
return &(it->second);
}
TSymbolTable::TSymbolTable() : mUniqueIdCounter(0), mUserDefinedUniqueIdsStart(-1)
{ {
} }
...@@ -401,49 +372,6 @@ void TSymbolTable::setGlobalInvariant(bool invariant) ...@@ -401,49 +372,6 @@ void TSymbolTable::setGlobalInvariant(bool invariant)
mTable.back()->setGlobalInvariant(invariant); mTable.back()->setGlobalInvariant(invariant);
} }
void TSymbolTable::insertUnmangledBuiltIn(const ImmutableString &name,
TExtension ext,
ESymbolLevel level)
{
ASSERT(level >= 0 && level <= LAST_BUILTIN_LEVEL);
ASSERT(mUserDefinedUniqueIdsStart == -1);
mBuiltInTable[level]->insertUnmangledBuiltIn(name, ext);
}
bool TSymbolTable::hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level)
{
ASSERT(level >= 0 && level <= LAST_BUILTIN_LEVEL);
return mBuiltInTable[level]->getUnmangledBuiltIn(ImmutableString(name)) != nullptr;
}
const UnmangledBuiltIn *TSymbolTable::getUnmangledBuiltInForShaderVersion(
const ImmutableString &name,
int shaderVersion)
{
for (int level = LAST_BUILTIN_LEVEL; level >= 0; --level)
{
if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
{
--level;
}
if (level == ESSL3_BUILTINS && shaderVersion < 300)
{
--level;
}
if (level == ESSL1_BUILTINS && shaderVersion != 100)
{
--level;
}
const UnmangledBuiltIn *builtIn = mBuiltInTable[level]->getUnmangledBuiltIn(name);
if (builtIn != nullptr)
{
return builtIn;
}
}
return nullptr;
}
void TSymbolTable::markBuiltInInitializationFinished() void TSymbolTable::markBuiltInInitializationFinished()
{ {
mUserDefinedUniqueIdsStart = mUniqueIdCounter; mUserDefinedUniqueIdsStart = mUniqueIdCounter;
...@@ -467,6 +395,8 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type, ...@@ -467,6 +395,8 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
ShShaderSpec spec, ShShaderSpec spec,
const ShBuiltInResources &resources) const ShBuiltInResources &resources)
{ {
mShaderType = type;
ASSERT(isEmpty()); ASSERT(isEmpty());
pushBuiltInLevel(); // COMMON_BUILTINS pushBuiltInLevel(); // COMMON_BUILTINS
pushBuiltInLevel(); // ESSL1_BUILTINS pushBuiltInLevel(); // ESSL1_BUILTINS
...@@ -506,7 +436,6 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type, ...@@ -506,7 +436,6 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
setDefaultPrecision(EbtAtomicCounter, EbpHigh); setDefaultPrecision(EbtAtomicCounter, EbpHigh);
insertBuiltInFunctions(type); insertBuiltInFunctions(type);
insertBuiltInFunctionUnmangledNames(type);
mUniqueIdCounter = kLastStaticBuiltInId + 1; mUniqueIdCounter = kLastStaticBuiltInId + 1;
initializeBuiltInVariables(type, spec, resources); initializeBuiltInVariables(type, spec, resources);
......
...@@ -56,8 +56,6 @@ const int LAST_BUILTIN_LEVEL = GLSL_BUILTINS; ...@@ -56,8 +56,6 @@ const int LAST_BUILTIN_LEVEL = GLSL_BUILTINS;
struct UnmangledBuiltIn struct UnmangledBuiltIn
{ {
constexpr UnmangledBuiltIn() : extension(TExtension::UNDEFINED) {}
constexpr UnmangledBuiltIn(TExtension extension) : extension(extension) {} constexpr UnmangledBuiltIn(TExtension extension) : extension(extension) {}
TExtension extension; TExtension extension;
...@@ -172,12 +170,6 @@ class TSymbolTable : angle::NonCopyable ...@@ -172,12 +170,6 @@ class TSymbolTable : angle::NonCopyable
TFunction *findUserDefinedFunction(const ImmutableString &name) const; TFunction *findUserDefinedFunction(const ImmutableString &name) const;
// Used to insert unmangled functions to check redeclaration of built-ins in ESSL 3.00 and
// above.
void insertUnmangledBuiltIn(const ImmutableString &name, TExtension ext, ESymbolLevel level);
bool hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level);
void initSamplerDefaultPrecision(TBasicType samplerType); void initSamplerDefaultPrecision(TBasicType samplerType);
void initializeBuiltInVariables(sh::GLenum type, void initializeBuiltInVariables(sh::GLenum type,
...@@ -186,7 +178,6 @@ class TSymbolTable : angle::NonCopyable ...@@ -186,7 +178,6 @@ class TSymbolTable : angle::NonCopyable
void markBuiltInInitializationFinished(); void markBuiltInInitializationFinished();
void insertBuiltInFunctions(sh::GLenum shaderType); void insertBuiltInFunctions(sh::GLenum shaderType);
void insertBuiltInFunctionUnmangledNames(sh::GLenum shaderType);
std::vector<std::unique_ptr<TSymbolTableBuiltInLevel>> mBuiltInTable; std::vector<std::unique_ptr<TSymbolTableBuiltInLevel>> mBuiltInTable;
std::vector<std::unique_ptr<TSymbolTableLevel>> mTable; std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
...@@ -204,6 +195,8 @@ class TSymbolTable : angle::NonCopyable ...@@ -204,6 +195,8 @@ class TSymbolTable : angle::NonCopyable
// TODO(oetuaho): Make this a compile-time constant once the symbol table is initialized at // TODO(oetuaho): Make this a compile-time constant once the symbol table is initialized at
// compile time. http://anglebug.com/1432 // compile time. http://anglebug.com/1432
int mUserDefinedUniqueIdsStart; int mUserDefinedUniqueIdsStart;
sh::GLenum mShaderType;
}; };
} // namespace sh } // namespace sh
......
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
'<(angle_path)/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp', '<(angle_path)/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp',
'<(angle_path)/src/tests/compiler_tests/GlFragDataNotModified_test.cpp', '<(angle_path)/src/tests/compiler_tests/GlFragDataNotModified_test.cpp',
'<(angle_path)/src/tests/compiler_tests/GeometryShader_test.cpp', '<(angle_path)/src/tests/compiler_tests/GeometryShader_test.cpp',
'<(angle_path)/src/tests/compiler_tests/ImmutableString_test_autogen.cpp',
'<(angle_path)/src/tests/compiler_tests/InitOutputVariables_test.cpp', '<(angle_path)/src/tests/compiler_tests/InitOutputVariables_test.cpp',
'<(angle_path)/src/tests/compiler_tests/IntermNode_test.cpp', '<(angle_path)/src/tests/compiler_tests/IntermNode_test.cpp',
'<(angle_path)/src/tests/compiler_tests/NV_draw_buffers_test.cpp', '<(angle_path)/src/tests/compiler_tests/NV_draw_buffers_test.cpp',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment