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 = {
],
'outputs': [
'src/compiler/translator/SymbolTable_autogen.cpp',
'tests/compiler_tests/ImmutableString_test_autogen.cpp',
],
'script': 'src/compiler/translator/gen_builtin_symbols.py',
},
......
......@@ -63,23 +63,15 @@ class TSymbolTable::TSymbolTableBuiltInLevel
public:
TSymbolTableBuiltInLevel() = default;
bool insert(const TSymbol *symbol);
void insert(const TSymbol *symbol);
const TSymbol *find(const ImmutableString &name) const;
void insertUnmangledBuiltIn(const ImmutableString &name, TExtension ext);
const UnmangledBuiltIn *getUnmangledBuiltIn(const ImmutableString &name) const;
private:
using tLevel = TUnorderedMap<ImmutableString,
const TSymbol *,
ImmutableString::FowlerNollVoHash<sizeof(size_t)>>;
using tLevelPair = const tLevel::value_type;
using tInsertResult = std::pair<tLevel::iterator, bool>;
tLevel mLevel;
std::map<ImmutableString, UnmangledBuiltIn> mUnmangledBuiltIns;
};
bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol)
......@@ -103,11 +95,9 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons
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
tInsertResult result = mLevel.insert(tLevelPair(symbol->getMangledName(), symbol));
return result.second;
mLevel.insert(tLevelPair(symbol->getMangledName(), symbol));
}
const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableString &name) const
......@@ -119,27 +109,8 @@ const TSymbol *TSymbolTable::TSymbolTableBuiltInLevel::find(const ImmutableStrin
return (*it).second;
}
void TSymbolTable::TSymbolTableBuiltInLevel::insertUnmangledBuiltIn(const ImmutableString &name,
TExtension ext)
{
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)
TSymbolTable::TSymbolTable()
: mUniqueIdCounter(0), mUserDefinedUniqueIdsStart(-1), mShaderType(GL_FRAGMENT_SHADER)
{
}
......@@ -401,49 +372,6 @@ void TSymbolTable::setGlobalInvariant(bool 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()
{
mUserDefinedUniqueIdsStart = mUniqueIdCounter;
......@@ -467,6 +395,8 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
ShShaderSpec spec,
const ShBuiltInResources &resources)
{
mShaderType = type;
ASSERT(isEmpty());
pushBuiltInLevel(); // COMMON_BUILTINS
pushBuiltInLevel(); // ESSL1_BUILTINS
......@@ -506,7 +436,6 @@ void TSymbolTable::initializeBuiltIns(sh::GLenum type,
setDefaultPrecision(EbtAtomicCounter, EbpHigh);
insertBuiltInFunctions(type);
insertBuiltInFunctionUnmangledNames(type);
mUniqueIdCounter = kLastStaticBuiltInId + 1;
initializeBuiltInVariables(type, spec, resources);
......
......@@ -56,8 +56,6 @@ const int LAST_BUILTIN_LEVEL = GLSL_BUILTINS;
struct UnmangledBuiltIn
{
constexpr UnmangledBuiltIn() : extension(TExtension::UNDEFINED) {}
constexpr UnmangledBuiltIn(TExtension extension) : extension(extension) {}
TExtension extension;
......@@ -172,12 +170,6 @@ class TSymbolTable : angle::NonCopyable
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 initializeBuiltInVariables(sh::GLenum type,
......@@ -186,7 +178,6 @@ class TSymbolTable : angle::NonCopyable
void markBuiltInInitializationFinished();
void insertBuiltInFunctions(sh::GLenum shaderType);
void insertBuiltInFunctionUnmangledNames(sh::GLenum shaderType);
std::vector<std::unique_ptr<TSymbolTableBuiltInLevel>> mBuiltInTable;
std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
......@@ -204,6 +195,8 @@ class TSymbolTable : angle::NonCopyable
// TODO(oetuaho): Make this a compile-time constant once the symbol table is initialized at
// compile time. http://anglebug.com/1432
int mUserDefinedUniqueIdsStart;
sh::GLenum mShaderType;
};
} // namespace sh
......
......@@ -72,6 +72,7 @@
'<(angle_path)/src/tests/compiler_tests/GLSLCompatibilityOutput_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/ImmutableString_test_autogen.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/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