Commit a5e693af by Olli Etuaho Committed by Commit Bot

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: 's avatarJamie Madill <jmadill@chromium.org>
parent e5285d29
......@@ -60,10 +60,10 @@ TIntermAggregate *CreateReplacementCall(TIntermAggregate *originalCall,
class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
{
public:
static void apply(TIntermNode *root, TSymbolUniqueId *temporaryId);
static void apply(TIntermNode *root, TSymbolTable *symbolTable);
private:
ArrayReturnValueToOutParameterTraverser();
ArrayReturnValueToOutParameterTraverser(TSymbolTable *symbolTable);
bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override;
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
......@@ -74,16 +74,16 @@ class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
bool mInFunctionWithArrayReturnValue;
};
void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolUniqueId *temporaryId)
void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolTable *symbolTable)
{
ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam;
arrayReturnValueToOutParam.useTemporaryId(temporaryId);
ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam(symbolTable);
root->traverse(&arrayReturnValueToOutParam);
arrayReturnValueToOutParam.updateTree();
}
ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser()
: TIntermTraverser(true, false, true), mInFunctionWithArrayReturnValue(false)
ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser(
TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable), mInFunctionWithArrayReturnValue(false)
{
}
......@@ -194,9 +194,9 @@ bool ArrayReturnValueToOutParameterTraverser::visitBinary(Visit visit, TIntermBi
} // namespace
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolUniqueId *temporaryId)
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable)
{
ArrayReturnValueToOutParameterTraverser::apply(root, temporaryId);
ArrayReturnValueToOutParameterTraverser::apply(root, symbolTable);
}
} // namespace sh
......@@ -14,9 +14,9 @@ namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolUniqueId *temporaryId);
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -241,8 +241,7 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
builtInFunctionEmulator(),
mDiagnostics(infoSink.info),
mSourcePath(nullptr),
mComputeShaderLocalSizeDeclared(false),
mTemporaryId()
mComputeShaderLocalSizeDeclared(false)
{
mComputeShaderLocalSize.fill(1);
}
......@@ -395,7 +394,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
if (success && shouldRunLoopAndIndexingValidation(compileOptions))
success =
ValidateLimitations(root, shaderType, symbolTable, shaderVersion, &mDiagnostics);
ValidateLimitations(root, shaderType, &symbolTable, shaderVersion, &mDiagnostics);
bool multiview2 = IsExtensionEnabled(extensionBehavior, "GL_OVR_multiview2");
if (success && compileResources.OVR_multiview && IsWebGLBasedSpec(shaderSpec) &&
......@@ -432,12 +431,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
parseContext.isMultiviewExtensionEnabled() && getShaderType() != GL_COMPUTE_SHADER)
{
DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, shaderType, compileOptions,
outputType, symbolTable);
outputType, &symbolTable);
}
// This pass might emit short circuits so keep it before the short circuit unfolding
if (success && (compileOptions & SH_REWRITE_DO_WHILE_LOOPS))
RewriteDoWhile(root, getTemporaryId());
RewriteDoWhile(root, &symbolTable);
if (success && (compileOptions & SH_ADD_AND_TRUE_TO_LOOP_CONDITION))
sh::AddAndTrueToLoopCondition(root);
......@@ -458,7 +457,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
{
ASSERT(!variablesCollected);
CollectVariables(root, &attributes, &outputVariables, &uniforms, &varyings,
&interfaceBlocks, hashFunction, symbolTable, shaderVersion,
&interfaceBlocks, hashFunction, &symbolTable, shaderVersion,
extensionBehavior);
variablesCollected = true;
if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS)
......@@ -504,12 +503,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
if (success && (compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS))
{
ScalarizeVecAndMatConstructorArgs(root, shaderType, fragmentPrecisionHigh,
getTemporaryId());
&symbolTable);
}
if (success && (compileOptions & SH_REGENERATE_STRUCT_NAMES))
{
RegenerateStructNames gen(symbolTable, shaderVersion);
RegenerateStructNames gen(&symbolTable, shaderVersion);
root->traverse(&gen);
}
......@@ -518,7 +517,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
IsExtensionEnabled(extensionBehavior, "GL_EXT_draw_buffers"))
{
EmulateGLFragColorBroadcast(root, compileResources.MaxDrawBuffers, &outputVariables,
symbolTable, shaderVersion);
&symbolTable, shaderVersion);
}
if (success)
......@@ -541,7 +540,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
IntermNodePatternMatcher::kMultiDeclaration |
IntermNodePatternMatcher::kArrayDeclaration |
IntermNodePatternMatcher::kNamelessStructDeclaration,
getTemporaryId(), getSymbolTable(), getShaderVersion());
&getSymbolTable(), getShaderVersion());
}
// We only really need to separate array declarations and nameless struct declarations,
// but it's simpler to just use the regular SeparateDeclarations.
......@@ -748,7 +747,6 @@ void TCompiler::clearResults()
nameMap.clear();
mSourcePath = nullptr;
mTemporaryId = TSymbolUniqueId();
}
bool TCompiler::initCallDag(TIntermNode *root)
......
......@@ -157,7 +157,6 @@ class TCompiler : public TShHandleBase
const char *getSourcePath() const;
const TPragma &getPragma() const { return mPragma; }
void writePragma(ShCompileOptions compileOptions);
TSymbolUniqueId *getTemporaryId() { return &mTemporaryId; }
// Relies on collectVariables having been called.
bool isVaryingDefined(const char *varyingName);
......@@ -247,8 +246,6 @@ class TCompiler : public TShHandleBase
NameMap nameMap;
TPragma mPragma;
TSymbolUniqueId mTemporaryId;
};
//
......
......@@ -135,12 +135,12 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
GLenum shaderType,
ShCompileOptions compileOptions,
ShShaderOutput shaderOutput,
const TSymbolTable &symbolTable)
TSymbolTable *symbolTable)
{
ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER);
TQualifier viewIDQualifier = (shaderType == GL_VERTEX_SHADER) ? EvqFlatOut : EvqFlatIn;
TIntermSymbol *viewIDSymbol = new TIntermSymbol(TSymbolTable::nextUniqueId(), "ViewID_OVR",
TIntermSymbol *viewIDSymbol = new TIntermSymbol(symbolTable->nextUniqueId(), "ViewID_OVR",
TType(EbtUInt, EbpHigh, viewIDQualifier));
viewIDSymbol->setInternal(true);
......@@ -151,13 +151,13 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
// Replacing gl_InstanceID with InstanceID should happen before adding the initializers of
// InstanceID and ViewID.
TIntermSymbol *instanceIDSymbol = new TIntermSymbol(
TSymbolTable::nextUniqueId(), "InstanceID", TType(EbtInt, EbpHigh, EvqGlobal));
symbolTable->nextUniqueId(), "InstanceID", TType(EbtInt, EbpHigh, EvqGlobal));
instanceIDSymbol->setInternal(true);
DeclareGlobalVariable(root, instanceIDSymbol);
ReplaceSymbol(root, "gl_InstanceID", instanceIDSymbol);
TIntermSequence *initializers = new TIntermSequence();
InitializeViewIDAndInstanceID(viewIDSymbol, instanceIDSymbol, numberOfViews, symbolTable,
InitializeViewIDAndInstanceID(viewIDSymbol, instanceIDSymbol, numberOfViews, *symbolTable,
initializers);
// The AST transformation which adds the expression to select the viewport index should
......
......@@ -35,7 +35,7 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
GLenum shaderType,
ShCompileOptions compileOptions,
ShShaderOutput shaderOutput,
const TSymbolTable &symbolTable);
TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -26,13 +26,10 @@ namespace
class GLFragColorBroadcastTraverser : public TIntermTraverser
{
public:
GLFragColorBroadcastTraverser(int maxDrawBuffers,
const TSymbolTable &symbolTable,
int shaderVersion)
: TIntermTraverser(true, false, false),
GLFragColorBroadcastTraverser(int maxDrawBuffers, TSymbolTable *symbolTable, int shaderVersion)
: TIntermTraverser(true, false, false, symbolTable),
mGLFragColorUsed(false),
mMaxDrawBuffers(maxDrawBuffers),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion)
{
}
......@@ -50,14 +47,13 @@ class GLFragColorBroadcastTraverser : public TIntermTraverser
private:
bool mGLFragColorUsed;
int mMaxDrawBuffers;
const TSymbolTable &mSymbolTable;
const int mShaderVersion;
};
TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataNode(int index) const
{
TIntermSymbol *symbol =
ReferenceBuiltInVariable(TString("gl_FragData"), mSymbolTable, mShaderVersion);
ReferenceBuiltInVariable(TString("gl_FragData"), *mSymbolTable, mShaderVersion);
TIntermTyped *indexNode = CreateIndexNode(index);
TIntermBinary *binary = new TIntermBinary(EOpIndexDirect, symbol, indexNode);
......@@ -98,7 +94,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root)
{
broadcastBlock->appendStatement(constructGLFragDataAssignNode(colorIndex));
}
RunAtTheEndOfShader(root, broadcastBlock);
RunAtTheEndOfShader(root, broadcastBlock, mSymbolTable);
}
} // namespace anonymous
......@@ -106,7 +102,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root)
void EmulateGLFragColorBroadcast(TIntermBlock *root,
int maxDrawBuffers,
std::vector<sh::OutputVariable> *outputVariables,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
{
ASSERT(maxDrawBuffers > 1);
......
......@@ -24,7 +24,7 @@ class TSymbolTable;
void EmulateGLFragColorBroadcast(TIntermBlock *root,
int maxDrawBuffers,
std::vector<OutputVariable> *outputVariables,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
}
......
......@@ -513,7 +513,7 @@ bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *nod
} // namespace anonymous
EmulatePrecision::EmulatePrecision(const TSymbolTable &symbolTable, int shaderVersion)
EmulatePrecision::EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion)
: TLValueTrackingTraverser(true, true, true, symbolTable, shaderVersion),
mDeclaringVariables(false)
{
......
......@@ -24,7 +24,7 @@ namespace sh
class EmulatePrecision : public TLValueTrackingTraverser
{
public:
EmulatePrecision(const TSymbolTable &symbolTable, int shaderVersion);
EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion);
void visitSymbol(TIntermSymbol *node) override;
bool visitBinary(Visit visit, TIntermBinary *node) override;
......
......@@ -22,10 +22,10 @@ namespace
class Traverser : public TIntermTraverser
{
public:
static void Apply(TIntermNode *root, TSymbolUniqueId *temporaryId);
static void Apply(TIntermNode *root, TSymbolTable *symbolTable);
private:
Traverser();
Traverser(TSymbolTable *symbolTable);
bool visitAggregate(Visit visit, TIntermAggregate *node) override;
void nextIteration();
......@@ -33,10 +33,9 @@ class Traverser : public TIntermTraverser
};
// static
void Traverser::Apply(TIntermNode *root, TSymbolUniqueId *temporaryId)
void Traverser::Apply(TIntermNode *root, TSymbolTable *symbolTable)
{
Traverser traverser;
traverser.useTemporaryId(temporaryId);
Traverser traverser(symbolTable);
do
{
traverser.nextIteration();
......@@ -48,7 +47,7 @@ void Traverser::Apply(TIntermNode *root, TSymbolUniqueId *temporaryId)
} while (traverser.mFound);
}
Traverser::Traverser() : TIntermTraverser(true, false, false)
Traverser::Traverser(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable)
{
}
......@@ -146,9 +145,9 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node)
} // anonymous namespace
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolUniqueId *temporaryId)
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable)
{
Traverser::Apply(root, temporaryId);
Traverser::Apply(root, symbolTable);
}
} // namespace sh
......@@ -20,9 +20,9 @@ namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolUniqueId *temporaryId);
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -689,7 +689,7 @@ void InsertBuiltInFunctions(sh::GLenum type,
fields->push_back(far);
fields->push_back(diff);
TStructure *depthRangeStruct =
new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields);
new TStructure(&symbolTable, NewPoolTString("gl_DepthRangeParameters"), fields);
symbolTable.insertStructType(COMMON_BUILTINS, depthRangeStruct);
TType depthRangeType(depthRangeStruct);
depthRangeType.setQualifier(EvqUniform);
......
......@@ -102,13 +102,17 @@ void TIntermBranch::traverse(TIntermTraverser *it)
it->traverseBranch(this);
}
TIntermTraverser::TIntermTraverser(bool preVisit, bool inVisit, bool postVisit)
TIntermTraverser::TIntermTraverser(bool preVisit,
bool inVisit,
bool postVisit,
TSymbolTable *symbolTable)
: preVisit(preVisit),
inVisit(inVisit),
postVisit(postVisit),
mDepth(-1),
mMaxDepth(0),
mInGlobalScope(true),
mSymbolTable(symbolTable),
mTemporaryId(nullptr)
{
}
......@@ -218,15 +222,15 @@ TIntermBinary *TIntermTraverser::createTempAssignment(TIntermTyped *rightNode)
return assignment;
}
void TIntermTraverser::useTemporaryId(TSymbolUniqueId *temporaryId)
{
mTemporaryId = temporaryId;
}
void TIntermTraverser::nextTemporaryId()
{
ASSERT(mTemporaryId != nullptr);
*mTemporaryId = TSymbolUniqueId();
ASSERT(mSymbolTable);
if (!mTemporaryId)
{
mTemporaryId = new TSymbolUniqueId(mSymbolTable);
return;
}
*mTemporaryId = TSymbolUniqueId(mSymbolTable);
}
void TLValueTrackingTraverser::addToFunctionMap(const TSymbolUniqueId &id,
......@@ -716,14 +720,14 @@ void TIntermTraverser::queueReplacementWithParent(TIntermNode *parent,
TLValueTrackingTraverser::TLValueTrackingTraverser(bool preVisit,
bool inVisit,
bool postVisit,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
: TIntermTraverser(preVisit, inVisit, postVisit),
: TIntermTraverser(preVisit, inVisit, postVisit, symbolTable),
mOperatorRequiresLValue(false),
mInFunctionCallOutParameter(false),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion)
{
ASSERT(symbolTable);
}
void TLValueTrackingTraverser::traverseFunctionPrototype(TIntermFunctionPrototype *node)
......@@ -796,7 +800,7 @@ void TLValueTrackingTraverser::traverseAggregate(TIntermAggregate *node)
if (!node->isFunctionCall() && !node->isConstructor())
{
builtInFunc = static_cast<TFunction *>(
mSymbolTable.findBuiltIn(node->getSymbolTableMangledName(), mShaderVersion));
mSymbolTable->findBuiltIn(node->getSymbolTableMangledName(), mShaderVersion));
}
size_t paramIndex = 0;
......
......@@ -39,7 +39,10 @@ class TIntermTraverser : angle::NonCopyable
{
public:
POOL_ALLOCATOR_NEW_DELETE();
TIntermTraverser(bool preVisit, bool inVisit, bool postVisit);
TIntermTraverser(bool preVisit,
bool inVisit,
bool postVisit,
TSymbolTable *symbolTable = nullptr);
virtual ~TIntermTraverser();
virtual void visitSymbol(TIntermSymbol *node) {}
......@@ -99,9 +102,6 @@ class TIntermTraverser : angle::NonCopyable
// this function after traversal to perform them.
void updateTree();
// Start creating temporary symbols from the given temporary symbol index + 1.
void useTemporaryId(TSymbolUniqueId *temporaryId);
protected:
// Should only be called from traverse*() functions
void incrementDepth(TIntermNode *current)
......@@ -246,6 +246,8 @@ class TIntermTraverser : angle::NonCopyable
std::vector<NodeReplaceWithMultipleEntry> mMultiReplacements;
std::vector<NodeInsertMultipleEntry> mInsertions;
TSymbolTable *mSymbolTable;
private:
static bool CompareInsertion(const NodeInsertMultipleEntry &a,
const NodeInsertMultipleEntry &b);
......@@ -300,7 +302,7 @@ class TLValueTrackingTraverser : public TIntermTraverser
TLValueTrackingTraverser(bool preVisit,
bool inVisit,
bool postVisit,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
virtual ~TLValueTrackingTraverser() {}
......@@ -345,7 +347,6 @@ class TLValueTrackingTraverser : public TIntermTraverser
// Map from function symbol id values to their parameter sequences
TMap<int, TIntermSequence *> mFunctionMap;
const TSymbolTable &mSymbolTable;
const int mShaderVersion;
};
......
......@@ -13,7 +13,7 @@ TOutputESSL::TOutputESSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
bool forceHighp,
......
......@@ -19,7 +19,7 @@ class TOutputESSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
bool forceHighp,
......
......@@ -15,7 +15,7 @@ TOutputGLSL::TOutputGLSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
......
......@@ -19,7 +19,7 @@ class TOutputGLSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
......
......@@ -121,18 +121,17 @@ TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
ShCompileOptions compileOptions)
: TIntermTraverser(true, true, true),
: TIntermTraverser(true, true, true, symbolTable),
mObjSink(objSink),
mDeclaringVariables(false),
mClampingStrategy(clampingStrategy),
mHashFunction(hashFunction),
mNameMap(nameMap),
mSymbolTable(symbolTable),
mShaderType(shaderType),
mShaderVersion(shaderVersion),
mOutput(output),
......@@ -600,7 +599,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
const TField *field = structure->fields()[index->getIConst(0)];
TString fieldName = field->name();
if (!mSymbolTable.findBuiltIn(structure->name(), mShaderVersion))
if (!mSymbolTable->findBuiltIn(structure->name(), mShaderVersion))
fieldName = hashName(TName(fieldName));
out << fieldName;
......@@ -617,7 +616,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
const TField *field = interfaceBlock->fields()[index->getIConst(0)];
TString fieldName = field->name();
ASSERT(!mSymbolTable.findBuiltIn(interfaceBlock->name(), mShaderVersion));
ASSERT(!mSymbolTable->findBuiltIn(interfaceBlock->name(), mShaderVersion));
fieldName = hashName(TName(fieldName));
out << fieldName;
......@@ -1168,7 +1167,7 @@ TString TOutputGLSLBase::hashName(const TName &name)
TString TOutputGLSLBase::hashVariableName(const TName &name)
{
if (mSymbolTable.findBuiltIn(name.getString(), mShaderVersion) != nullptr)
if (mSymbolTable->findBuiltIn(name.getString(), mShaderVersion) != nullptr)
{
if (mCompileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM &&
name.getString() == "gl_ViewID_OVR")
......
......@@ -23,7 +23,7 @@ class TOutputGLSLBase : public TIntermTraverser
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
......@@ -100,8 +100,6 @@ class TOutputGLSLBase : public TIntermTraverser
NameMap &mNameMap;
TSymbolTable &mSymbolTable;
sh::GLenum mShaderType;
const int mShaderVersion;
......
......@@ -18,7 +18,7 @@ TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
......
......@@ -21,7 +21,7 @@ class TOutputVulkanGLSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
......
......@@ -3080,13 +3080,13 @@ TFunction *TParseContext::parseFunctionHeader(const TPublicType &type,
}
// Add the function as a prototype after parsing it (we do not support recursion)
return new TFunction(name, new TType(type));
return new TFunction(&symbolTable, name, new TType(type));
}
TFunction *TParseContext::addNonConstructorFunc(const TString *name, const TSourceLoc &loc)
{
const TType *returnType = TCache::getType(EbtVoid, EbpUndefined);
return new TFunction(name, returnType);
return new TFunction(&symbolTable, name, returnType);
}
TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType)
......@@ -3110,7 +3110,7 @@ TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType)
type->setBasicType(EbtFloat);
}
return new TFunction(nullptr, type, EOpConstruct);
return new TFunction(&symbolTable, nullptr, type, EOpConstruct);
}
TParameter TParseContext::parseParameterDeclarator(const TPublicType &publicType,
......@@ -4143,7 +4143,7 @@ TTypeSpecifierNonArray TParseContext::addStructure(const TSourceLoc &structLine,
const TString *structName,
TFieldList *fieldList)
{
TStructure *structure = new TStructure(structName, fieldList);
TStructure *structure = new TStructure(&symbolTable, structName, fieldList);
// Store a bool in the struct if we're at global scope, to allow us to
// skip the local struct scoping workaround in HLSL.
......
......@@ -28,7 +28,7 @@ namespace
class RecordConstantPrecisionTraverser : public TIntermTraverser
{
public:
RecordConstantPrecisionTraverser();
RecordConstantPrecisionTraverser(TSymbolTable *symbolTable);
void visitConstantUnion(TIntermConstantUnion *node) override;
......@@ -41,8 +41,8 @@ class RecordConstantPrecisionTraverser : public TIntermTraverser
bool mFoundHigherPrecisionConstant;
};
RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser()
: TIntermTraverser(true, false, true), mFoundHigherPrecisionConstant(false)
RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable), mFoundHigherPrecisionConstant(false)
{
}
......@@ -151,11 +151,9 @@ void RecordConstantPrecisionTraverser::nextIteration()
} // namespace
void RecordConstantPrecision(TIntermNode *root, TSymbolUniqueId *temporaryId)
void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable)
{
RecordConstantPrecisionTraverser traverser;
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
RecordConstantPrecisionTraverser traverser(symbolTable);
// Iterate as necessary, and reset the traverser between iterations.
do
{
......
......@@ -20,9 +20,9 @@
namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void RecordConstantPrecision(TIntermNode *root, TSymbolUniqueId *temporaryId);
void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
#endif // COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_
......@@ -19,7 +19,7 @@ void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol)
if (!userType)
return;
if (mSymbolTable.findBuiltIn(userType->name(), mShaderVersion))
if (mSymbolTable->findBuiltIn(userType->name(), mShaderVersion))
{
// Built-in struct, do not touch it.
return;
......
......@@ -18,9 +18,8 @@ namespace sh
class RegenerateStructNames : public TIntermTraverser
{
public:
RegenerateStructNames(const TSymbolTable &symbolTable, int shaderVersion)
: TIntermTraverser(true, false, false),
mSymbolTable(symbolTable),
RegenerateStructNames(TSymbolTable *symbolTable, int shaderVersion)
: TIntermTraverser(true, false, false, symbolTable),
mShaderVersion(shaderVersion),
mScopeDepth(0)
{
......@@ -31,7 +30,6 @@ class RegenerateStructNames : public TIntermTraverser
bool visitBlock(Visit, TIntermBlock *block) override;
private:
const TSymbolTable &mSymbolTable;
int mShaderVersion;
// Indicating the depth of the current scope.
......
......@@ -291,7 +291,7 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
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 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
// 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 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
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 @@ void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root)
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 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
#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 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
// 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 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
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 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
// 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 @@ void RemoveDynamicIndexingTraverser::nextIteration()
} // 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();
......
......@@ -15,12 +15,8 @@ namespace sh
class TIntermNode;
class TSymbolTable;
class TSymbolUniqueId;
void RemoveDynamicIndexing(TIntermNode *root,
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
int shaderVersion);
void RemoveDynamicIndexing(TIntermNode *root, TSymbolTable *symbolTable, int shaderVersion);
} // namespace sh
......
......@@ -44,7 +44,7 @@ namespace
class DoWhileRewriter : public TIntermTraverser
{
public:
DoWhileRewriter() : TIntermTraverser(true, false, false) {}
DoWhileRewriter(const TSymbolTable *symbolTable) : TIntermTraverser(true, false, false) {}
bool visitBlock(Visit, TIntermBlock *node) override
{
......@@ -146,12 +146,9 @@ class DoWhileRewriter : public TIntermTraverser
} // anonymous namespace
void RewriteDoWhile(TIntermNode *root, TSymbolUniqueId *temporaryId)
void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable)
{
ASSERT(temporaryId != 0);
DoWhileRewriter rewriter;
rewriter.useTemporaryId(temporaryId);
DoWhileRewriter rewriter(symbolTable);
root->traverse(&rewriter);
}
......
......@@ -14,9 +14,9 @@ namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void RewriteDoWhile(TIntermNode *root, TSymbolUniqueId *temporaryId);
void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -9,6 +9,7 @@
#include "compiler/translator/RewriteElseBlocks.h"
#include "compiler/translator/IntermNode.h"
#include "compiler/translator/IntermNode_util.h"
#include "compiler/translator/NodeSearch.h"
#include "compiler/translator/SymbolTable.h"
......@@ -22,19 +23,20 @@ namespace
class ElseBlockRewriter : public TIntermTraverser
{
public:
ElseBlockRewriter();
ElseBlockRewriter(TSymbolTable *symbolTable);
protected:
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override;
bool visitBlock(Visit visit, TIntermBlock *block) override;
private:
const TType *mFunctionType;
TIntermNode *rewriteIfElse(TIntermIfElse *ifElse);
const TType *mFunctionType;
};
ElseBlockRewriter::ElseBlockRewriter() : TIntermTraverser(true, false, true), mFunctionType(nullptr)
ElseBlockRewriter::ElseBlockRewriter(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable), mFunctionType(nullptr)
{
}
......@@ -109,10 +111,9 @@ TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse)
} // anonymous namespace
void RewriteElseBlocks(TIntermNode *node, TSymbolUniqueId *temporaryId)
void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable)
{
ElseBlockRewriter rewriter;
rewriter.useTemporaryId(temporaryId);
ElseBlockRewriter rewriter(symbolTable);
node->traverse(&rewriter);
}
......
......@@ -10,12 +10,13 @@
#ifndef COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
#define COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
#include "compiler/translator/IntermNode.h"
namespace sh
{
void RewriteElseBlocks(TIntermNode *node, TSymbolUniqueId *temporaryId);
class TIntermNode;
class TSymbolTable;
void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable);
}
#endif // COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
......@@ -60,10 +60,13 @@ bool ContainsReturn(TIntermNode *node)
return traverser.containsReturn();
}
void WrapMainAndAppend(TIntermBlock *root, TIntermFunctionDefinition *main, TIntermNode *codeToRun)
void WrapMainAndAppend(TIntermBlock *root,
TIntermFunctionDefinition *main,
TIntermNode *codeToRun,
TSymbolTable *symbolTable)
{
// Replace main() with main0() with the same body.
TSymbolUniqueId oldMainId;
TSymbolUniqueId oldMainId(symbolTable);
std::stringstream oldMainName;
oldMainName << "main" << oldMainId.get();
TIntermFunctionDefinition *oldMain = CreateInternalFunctionDefinitionNode(
......@@ -94,7 +97,7 @@ void WrapMainAndAppend(TIntermBlock *root, TIntermFunctionDefinition *main, TInt
} // anonymous namespace
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun)
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable)
{
TIntermFunctionDefinition *main = FindMain(root);
if (!ContainsReturn(main))
......@@ -103,7 +106,7 @@ void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun)
return;
}
WrapMainAndAppend(root, main, codeToRun);
WrapMainAndAppend(root, main, codeToRun, symbolTable);
}
} // namespace sh
......@@ -14,8 +14,9 @@ namespace sh
class TIntermBlock;
class TIntermNode;
class TSymbolTable;
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun);
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -63,12 +63,11 @@ class ScalarizeArgsTraverser : public TIntermTraverser
public:
ScalarizeArgsTraverser(sh::GLenum shaderType,
bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId)
: TIntermTraverser(true, false, false),
TSymbolTable *symbolTable)
: TIntermTraverser(true, false, false, symbolTable),
mShaderType(shaderType),
mFragmentPrecisionHigh(fragmentPrecisionHigh)
{
useTemporaryId(temporaryId);
}
protected:
......@@ -230,9 +229,9 @@ void ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original)
void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root,
sh::GLenum shaderType,
bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId)
TSymbolTable *symbolTable)
{
ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, temporaryId);
ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, symbolTable);
root->traverse(&scalarizer);
}
......
......@@ -16,12 +16,12 @@
namespace sh
{
class TIntermBlock;
class TSymbolUniqueId;
class TSymbolTable;
void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root,
sh::GLenum shaderType,
bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId);
TSymbolTable *symbolTable);
} // namespace sh
#endif // COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_
......@@ -24,7 +24,7 @@ namespace
class SeparateExpressionsTraverser : public TIntermTraverser
{
public:
SeparateExpressionsTraverser();
SeparateExpressionsTraverser(TSymbolTable *symbolTable);
bool visitBinary(Visit visit, TIntermBinary *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *node) override;
......@@ -40,8 +40,8 @@ class SeparateExpressionsTraverser : public TIntermTraverser
IntermNodePatternMatcher mPatternToSeparateMatcher;
};
SeparateExpressionsTraverser::SeparateExpressionsTraverser()
: TIntermTraverser(true, false, false),
SeparateExpressionsTraverser::SeparateExpressionsTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, false, symbolTable),
mFoundArrayExpression(false),
mPatternToSeparateMatcher(IntermNodePatternMatcher::kExpressionReturningArray)
{
......@@ -110,11 +110,9 @@ void SeparateExpressionsTraverser::nextIteration()
} // namespace
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolUniqueId *temporaryId)
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable)
{
SeparateExpressionsTraverser traverser;
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
SeparateExpressionsTraverser traverser(symbolTable);
// Separate one expression at a time, and reset the traverser between iterations.
do
{
......
......@@ -15,9 +15,9 @@
namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolUniqueId *temporaryId);
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
#endif // COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_
......@@ -24,7 +24,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser
{
public:
SimplifyLoopConditionsTraverser(unsigned int conditionsToSimplifyMask,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
void traverseLoop(TIntermLoop *node) override;
......@@ -46,7 +46,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser
SimplifyLoopConditionsTraverser::SimplifyLoopConditionsTraverser(
unsigned int conditionsToSimplifyMask,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
: TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
mFoundLoopToChange(false),
......@@ -276,13 +276,10 @@ void SimplifyLoopConditionsTraverser::traverseLoop(TIntermLoop *node)
void SimplifyLoopConditions(TIntermNode *root,
unsigned int conditionsToSimplifyMask,
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
{
SimplifyLoopConditionsTraverser traverser(conditionsToSimplifyMask, symbolTable, shaderVersion);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
root->traverse(&traverser);
traverser.updateTree();
}
......
......@@ -15,12 +15,10 @@ namespace sh
{
class TIntermNode;
class TSymbolTable;
class TSymbolUniqueId;
void SimplifyLoopConditions(TIntermNode *root,
unsigned int conditionsToSimplify,
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
} // namespace sh
......
......@@ -24,7 +24,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser
{
public:
SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
bool visitBinary(Visit visit, TIntermBinary *node) override;
......@@ -44,7 +44,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser
};
SplitSequenceOperatorTraverser::SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
: TLValueTrackingTraverser(true, false, true, symbolTable, shaderVersion),
mFoundExpressionToSplit(false),
......@@ -138,13 +138,10 @@ bool SplitSequenceOperatorTraverser::visitTernary(Visit visit, TIntermTernary *n
void SplitSequenceOperator(TIntermNode *root,
int patternsToSplitMask,
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion)
{
SplitSequenceOperatorTraverser traverser(patternsToSplitMask, symbolTable, shaderVersion);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
// Separate one expression at a time, and reset the traverser between iterations.
do
{
......
......@@ -17,12 +17,10 @@ namespace sh
class TIntermNode;
class TSymbolTable;
class TSymbolUniqueId;
void SplitSequenceOperator(TIntermNode *root,
int patternsToSplitMask,
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion);
} // namespace sh
......
......@@ -29,9 +29,7 @@ static const char kFunctionMangledNameSeparator = '(';
} // anonymous namespace
int TSymbolTable::uniqueIdCounter = 0;
TSymbolUniqueId::TSymbolUniqueId() : mId(TSymbolTable::nextUniqueId())
TSymbolUniqueId::TSymbolUniqueId(TSymbolTable *symbolTable) : mId(symbolTable->nextUniqueId())
{
}
......@@ -44,7 +42,8 @@ int TSymbolUniqueId::get() const
return mId;
}
TSymbol::TSymbol(const TString *n) : uniqueId(TSymbolTable::nextUniqueId()), name(n)
TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *n)
: uniqueId(symbolTable->nextUniqueId()), name(n)
{
}
......@@ -281,7 +280,7 @@ TVariable *TSymbolTable::declareStructType(TStructure *str)
TInterfaceBlockName *TSymbolTable::declareInterfaceBlockName(const TString *name)
{
TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(name);
TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(this, name);
if (insert(currentLevel(), blockNameSymbol))
{
return blockNameSymbol;
......@@ -296,7 +295,7 @@ TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, co
TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const TString *name, const TType &type)
{
TVariable *var = new TVariable(name, type);
TVariable *var = new TVariable(this, name, type);
if (insert(level, var))
{
// Do lazy initialization for struct types, so we allocate to the current scope.
......@@ -314,7 +313,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
const char *name,
const TType &type)
{
TVariable *var = new TVariable(NewPoolTString(name), type);
TVariable *var = new TVariable(this, NewPoolTString(name), type);
if (insert(level, ext, var))
{
if (var->getType().getBasicType() == EbtStruct)
......@@ -328,7 +327,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
TVariable *TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str)
{
TVariable *var = new TVariable(&str->name(), TType(str), true);
TVariable *var = new TVariable(this, &str->name(), TType(str), true);
if (insert(level, var))
{
var->getType().realize();
......@@ -467,7 +466,7 @@ void TSymbolTable::insertBuiltIn(ESymbolLevel level,
}
else
{
TFunction *function = new TFunction(NewPoolTString(name), rvalue, op, ext);
TFunction *function = new TFunction(this, NewPoolTString(name), rvalue, op, ext);
function->addParameter(TConstParameter(ptype1));
......@@ -532,7 +531,7 @@ void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level,
const char *name)
{
insertUnmangledBuiltInName(name, level);
insert(level, new TFunction(NewPoolTString(name), rvalue, op));
insert(level, new TFunction(this, NewPoolTString(name), rvalue, op));
}
TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
......
......@@ -46,7 +46,7 @@ class TSymbolUniqueId
{
public:
POOL_ALLOCATOR_NEW_DELETE();
TSymbolUniqueId();
TSymbolUniqueId(TSymbolTable *symbolTable);
TSymbolUniqueId(const TSymbol &symbol);
TSymbolUniqueId(const TSymbolUniqueId &) = default;
TSymbolUniqueId &operator=(const TSymbolUniqueId &) = default;
......@@ -62,7 +62,7 @@ class TSymbol : angle::NonCopyable
{
public:
POOL_ALLOCATOR_NEW_DELETE();
TSymbol(const TString *n);
TSymbol(TSymbolTable *symbolTable, const TString *n);
virtual ~TSymbol()
{
......@@ -103,8 +103,11 @@ class TVariable : public TSymbol
private:
friend class TSymbolTable;
TVariable(const TString *name, const TType &t, bool isUserTypeDefinition = false)
: TSymbol(name), type(t), userType(isUserTypeDefinition), unionArray(0)
TVariable(TSymbolTable *symbolTable,
const TString *name,
const TType &t,
bool isUserTypeDefinition = false)
: TSymbol(symbolTable, name), type(t), userType(isUserTypeDefinition), unionArray(0)
{
}
......@@ -159,11 +162,12 @@ struct TParameter
class TFunction : public TSymbol
{
public:
TFunction(const TString *name,
TFunction(TSymbolTable *symbolTable,
const TString *name,
const TType *retType,
TOperator tOp = EOpNull,
const char *ext = "")
: TSymbol(name),
: TSymbol(symbolTable, name),
returnType(retType),
mangledName(nullptr),
op(tOp),
......@@ -229,7 +233,9 @@ class TInterfaceBlockName : public TSymbol
private:
friend class TSymbolTable;
TInterfaceBlockName(const TString *name) : TSymbol(name) {}
TInterfaceBlockName(TSymbolTable *symbolTable, const TString *name) : TSymbol(symbolTable, name)
{
}
};
class TSymbolTableLevel
......@@ -292,7 +298,7 @@ const int GLOBAL_LEVEL = 4;
class TSymbolTable : angle::NonCopyable
{
public:
TSymbolTable()
TSymbolTable() : mUniqueIdCounter(0)
{
// The symbol table cannot be used until push() is called, but
// the lack of an initial call to push() can be used to detect
......@@ -342,7 +348,7 @@ class TSymbolTable : angle::NonCopyable
bool insertConstInt(ESymbolLevel level, const char *name, int value, TPrecision precision)
{
TVariable *constant =
new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1));
new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1));
TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray);
......@@ -352,7 +358,7 @@ class TSymbolTable : angle::NonCopyable
bool insertConstIntExt(ESymbolLevel level, const char *ext, const char *name, int value)
{
TVariable *constant =
new TVariable(NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1));
new TVariable(this, NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1));
TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray);
......@@ -365,7 +371,7 @@ class TSymbolTable : angle::NonCopyable
TPrecision precision)
{
TVariable *constantIvec3 =
new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3));
new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3));
TConstantUnion *unionArray = new TConstantUnion[3];
for (size_t index = 0u; index < 3u; ++index)
......@@ -488,7 +494,7 @@ class TSymbolTable : angle::NonCopyable
table[currentLevel()]->setGlobalInvariant(invariant);
}
static int nextUniqueId() { return ++uniqueIdCounter; }
int nextUniqueId() { return ++mUniqueIdCounter; }
// Checks whether there is a built-in accessible by a shader with the specified version.
bool hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion);
......@@ -516,7 +522,7 @@ class TSymbolTable : angle::NonCopyable
typedef TMap<TBasicType, TPrecision> PrecisionStackLevel;
std::vector<PrecisionStackLevel *> precisionStack;
static int uniqueIdCounter;
int mUniqueIdCounter;
};
} // namespace sh
......
......@@ -56,13 +56,13 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation)
{
EmulatePrecision emulatePrecision(getSymbolTable(), shaderVer);
EmulatePrecision emulatePrecision(&getSymbolTable(), shaderVer);
root->traverse(&emulatePrecision);
emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(sink, shaderVer, SH_ESSL_OUTPUT);
}
RecordConstantPrecision(root, getTemporaryId());
RecordConstantPrecision(root, &getSymbolTable());
// Write emulated built-in functions if needed.
if (!getBuiltInFunctionEmulator().isOutputEmpty())
......@@ -97,7 +97,7 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
// Write translated shader.
TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(),
getSymbolTable(), getShaderType(), shaderVer, precisionEmulation,
&getSymbolTable(), getShaderType(), shaderVer, precisionEmulation,
compileOptions);
if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM)
......
......@@ -107,7 +107,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation)
{
EmulatePrecision emulatePrecision(getSymbolTable(), getShaderVersion());
EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion());
root->traverse(&emulatePrecision);
emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(sink, getShaderVersion(), getOutputType());
......@@ -202,7 +202,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
// Write translated shader.
TOutputGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(),
getSymbolTable(), getShaderType(), getShaderVersion(), getOutputType(),
&getSymbolTable(), getShaderType(), getShaderVersion(), getOutputType(),
compileOptions);
if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM)
......
......@@ -46,7 +46,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
IntermNodePatternMatcher::kUnfoldedShortCircuitExpression |
IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue |
IntermNodePatternMatcher::kMultiDeclaration,
getTemporaryId(), getSymbolTable(), getShaderVersion());
&getSymbolTable(), getShaderVersion());
// Note that separate declarations need to be run before other AST transformations that
// generate new statements from expressions.
......@@ -56,31 +56,31 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
IntermNodePatternMatcher::kExpressionReturningArray |
IntermNodePatternMatcher::kUnfoldedShortCircuitExpression |
IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue,
getTemporaryId(), getSymbolTable(), getShaderVersion());
&getSymbolTable(), getShaderVersion());
// Note that SeparateDeclarations needs to be run before UnfoldShortCircuitToIf.
UnfoldShortCircuitToIf(root, getTemporaryId());
UnfoldShortCircuitToIf(root, &getSymbolTable());
SeparateExpressionsReturningArrays(root, getTemporaryId());
SeparateExpressionsReturningArrays(root, &getSymbolTable());
// Note that SeparateDeclarations needs to be run before SeparateArrayInitialization.
SeparateArrayInitialization(root);
// HLSL doesn't support arrays as return values, we'll need to make functions that have an array
// as a return value to use an out parameter to transfer the array data instead.
ArrayReturnValueToOutParameter(root, getTemporaryId());
ArrayReturnValueToOutParameter(root, &getSymbolTable());
if (!shouldRunLoopAndIndexingValidation(compileOptions))
{
// HLSL doesn't support dynamic indexing of vectors and matrices.
RemoveDynamicIndexing(root, getTemporaryId(), getSymbolTable(), getShaderVersion());
RemoveDynamicIndexing(root, &getSymbolTable(), getShaderVersion());
}
// Work around D3D9 bug that would manifest in vertex shaders with selection blocks which
// use a vertex attribute as a condition, and some related computation in the else block.
if (getOutputType() == SH_HLSL_3_0_OUTPUT && getShaderType() == GL_VERTEX_SHADER)
{
sh::RewriteElseBlocks(root, getTemporaryId());
sh::RewriteElseBlocks(root, &getSymbolTable());
}
// Work around an HLSL compiler frontend aliasing optimization bug.
......@@ -94,7 +94,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation)
{
EmulatePrecision emulatePrecision(getSymbolTable(), getShaderVersion());
EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion());
root->traverse(&emulatePrecision);
emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(getInfoSink().obj, getShaderVersion(),
......@@ -103,7 +103,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if ((compileOptions & SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS) != 0)
{
sh::ExpandIntegerPowExpressions(root, getTemporaryId());
sh::ExpandIntegerPowExpressions(root, &getSymbolTable());
}
if ((compileOptions & SH_REWRITE_TEXELFETCHOFFSET_TO_TEXELFETCH) != 0)
......
......@@ -63,7 +63,7 @@ void TranslatorVulkan::translate(TIntermBlock *root, ShCompileOptions compileOpt
// Write translated shader.
TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(),
getNameMap(), getSymbolTable(), getShaderType(),
getNameMap(), &getSymbolTable(), getShaderType(),
getShaderVersion(), getOutputType(), compileOptions);
root->traverse(&outputGLSL);
}
......
......@@ -504,10 +504,10 @@ int TType::getLocationCount() const
return count;
}
TStructure::TStructure(const TString *name, TFieldList *fields)
TStructure::TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields)
: TFieldListCollection(name, fields),
mDeepestNesting(0),
mUniqueId(TSymbolTable::nextUniqueId()),
mUniqueId(symbolTable->nextUniqueId()),
mAtGlobalScope(false)
{
}
......
......@@ -20,6 +20,7 @@ struct TPublicType;
class TType;
class TSymbol;
class TIntermSymbol;
class TSymbolTable;
class TField : angle::NonCopyable
{
......@@ -87,7 +88,7 @@ class TStructure : public TFieldListCollection
{
public:
POOL_ALLOCATOR_NEW_DELETE();
TStructure(const TString *name, TFieldList *fields);
TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields);
int deepestNesting() const
{
......@@ -138,7 +139,7 @@ class TStructure : public TFieldListCollection
int calculateDeepestNesting() const;
mutable int mDeepestNesting;
int mUniqueId;
const int mUniqueId;
bool mAtGlobalScope;
};
......
......@@ -24,7 +24,7 @@ namespace
class UnfoldShortCircuitTraverser : public TIntermTraverser
{
public:
UnfoldShortCircuitTraverser();
UnfoldShortCircuitTraverser(TSymbolTable *symbolTable);
bool visitBinary(Visit visit, TIntermBinary *node) override;
bool visitTernary(Visit visit, TIntermTernary *node) override;
......@@ -40,8 +40,8 @@ class UnfoldShortCircuitTraverser : public TIntermTraverser
IntermNodePatternMatcher mPatternToUnfoldMatcher;
};
UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser()
: TIntermTraverser(true, false, true),
UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable),
mFoundShortCircuit(false),
mPatternToUnfoldMatcher(IntermNodePatternMatcher::kUnfoldedShortCircuitExpression)
{
......@@ -170,11 +170,9 @@ void UnfoldShortCircuitTraverser::nextIteration()
} // namespace
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolUniqueId *temporaryId)
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable)
{
UnfoldShortCircuitTraverser traverser;
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
UnfoldShortCircuitTraverser traverser(symbolTable);
// Unfold one operator at a time, and reset the traverser between iterations.
do
{
......
......@@ -16,9 +16,9 @@ namespace sh
{
class TIntermNode;
class TSymbolUniqueId;
class TSymbolTable;
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolUniqueId *temporaryId);
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -71,7 +71,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser
{
public:
ValidateLimitationsTraverser(sh::GLenum shaderType,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
TDiagnostics *diagnostics);
......@@ -104,7 +104,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser
};
ValidateLimitationsTraverser::ValidateLimitationsTraverser(sh::GLenum shaderType,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
TDiagnostics *diagnostics)
: TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
......@@ -432,7 +432,7 @@ bool ValidateLimitationsTraverser::validateIndexing(TIntermBinary *node)
bool ValidateLimitations(TIntermNode *root,
GLenum shaderType,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
TDiagnostics *diagnostics)
{
......
......@@ -18,7 +18,7 @@ class TDiagnostics;
// 1.00 spec Appendix A.
bool ValidateLimitations(TIntermNode *root,
GLenum shaderType,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
TDiagnostics *diagnostics);
......
......@@ -95,7 +95,7 @@ class CollectVariablesTraverser : public TIntermTraverser
std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
const TExtensionBehavior &extensionBehavior);
......@@ -147,7 +147,6 @@ class CollectVariablesTraverser : public TIntermTraverser
ShHashFunction64 mHashFunction;
const TSymbolTable &mSymbolTable;
int mShaderVersion;
const TExtensionBehavior &mExtensionBehavior;
};
......@@ -159,10 +158,10 @@ CollectVariablesTraverser::CollectVariablesTraverser(
std::vector<sh::Varying> *varyings,
std::vector<sh::InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
const TExtensionBehavior &extensionBehavior)
: TIntermTraverser(true, false, false),
: TIntermTraverser(true, false, false, symbolTable),
mAttribs(attribs),
mOutputVariables(outputVariables),
mUniforms(uniforms),
......@@ -184,7 +183,6 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mSecondaryFragColorEXTAdded(false),
mSecondaryFragDataEXTAdded(false),
mHashFunction(hashFunction),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion),
mExtensionBehavior(extensionBehavior)
{
......@@ -194,7 +192,7 @@ void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const char *name,
ShaderVariable *info)
{
TVariable *symbolTableVar =
reinterpret_cast<TVariable *>(mSymbolTable.findBuiltIn(name, mShaderVersion));
reinterpret_cast<TVariable *>(mSymbolTable->findBuiltIn(name, mShaderVersion));
ASSERT(symbolTableVar);
const TType &type = symbolTableVar->getType();
......@@ -212,7 +210,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const char *name, bool
Varying info;
setBuiltInInfoFromSymbolTable(name, &info);
info.staticUse = true;
info.isInvariant = mSymbolTable.isVaryingInvariant(name);
info.isInvariant = mSymbolTable->isVaryingInvariant(name);
mVaryings->push_back(info);
(*addedFlag) = true;
}
......@@ -502,7 +500,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable)
case EvqSmoothOut:
case EvqFlatOut:
case EvqCentroidOut:
if (mSymbolTable.isVaryingInvariant(std::string(variable.getSymbol().c_str())) ||
if (mSymbolTable->isVaryingInvariant(std::string(variable.getSymbol().c_str())) ||
type.isInvariant())
{
varying.isInvariant = true;
......@@ -652,7 +650,7 @@ void CollectVariables(TIntermBlock *root,
std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
const TExtensionBehavior &extensionBehavior)
{
......
......@@ -24,7 +24,7 @@ void CollectVariables(TIntermBlock *root,
std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable,
TSymbolTable *symbolTable,
int shaderVersion,
const TExtensionBehavior &extensionBehavior);
......
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