Simplify AST transformations that need to find main
Share code for finding the main function from the AST between
InitializeVariables, DeferGlobalInitializers,
EmulateGLFragColorBroadcast and UseInterfaceBlockFields. This makes
InitializeVariables simpler in particular, as it doesn't need an AST
traverser anymore.
BUG=angleproject:2033
TEST=angle_unittests, WebGL conformance tests
Change-Id: I14c994bbde58a904f6684d2f0b72bd8004f70902
Reviewed-on: https://chromium-review.googlesource.com/501166
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/InitializeVariables.cpp b/src/compiler/translator/InitializeVariables.cpp
index 8cb50ae..0c9a959 100644
--- a/src/compiler/translator/InitializeVariables.cpp
+++ b/src/compiler/translator/InitializeVariables.cpp
@@ -8,6 +8,7 @@
#include "angle_gl.h"
#include "common/debug.h"
+#include "compiler/translator/FindMain.h"
#include "compiler/translator/IntermNode.h"
#include "compiler/translator/SymbolTable.h"
#include "compiler/translator/util.h"
@@ -18,54 +19,11 @@
namespace
{
-class VariableInitializer : public TIntermTraverser
+void InsertInitCode(TIntermSequence *sequence,
+ const InitVariableList &variables,
+ const TSymbolTable &symbolTable)
{
- public:
- VariableInitializer(const InitVariableList &vars, const TSymbolTable &symbolTable)
- : TIntermTraverser(true, false, false),
- mVariables(vars),
- mSymbolTable(symbolTable),
- mCodeInserted(false)
- {
- ASSERT(mSymbolTable.atGlobalLevel());
- }
-
- protected:
- bool visitBinary(Visit, TIntermBinary *node) override { return false; }
- bool visitUnary(Visit, TIntermUnary *node) override { return false; }
- bool visitIfElse(Visit, TIntermIfElse *node) override { return false; }
- bool visitLoop(Visit, TIntermLoop *node) override { return false; }
- bool visitBranch(Visit, TIntermBranch *node) override { return false; }
- bool visitAggregate(Visit, TIntermAggregate *node) override { return false; }
-
- bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
-
- private:
- void insertInitCode(TIntermSequence *sequence);
-
- const InitVariableList &mVariables;
- const TSymbolTable &mSymbolTable;
- bool mCodeInserted;
-};
-
-// VariableInitializer implementation.
-
-bool VariableInitializer::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node)
-{
- // Function definition.
- ASSERT(visit == PreVisit);
- if (node->getFunctionSymbolInfo()->isMain())
- {
- TIntermBlock *body = node->getBody();
- insertInitCode(body->getSequence());
- mCodeInserted = true;
- }
- return false;
-}
-
-void VariableInitializer::insertInitCode(TIntermSequence *sequence)
-{
- for (const auto &var : mVariables)
+ for (const auto &var : variables)
{
TString name = TString(var.name.c_str());
@@ -102,7 +60,7 @@
}
else if (var.isStruct())
{
- TVariable *structInfo = reinterpret_cast<TVariable *>(mSymbolTable.findGlobal(name));
+ TVariable *structInfo = reinterpret_cast<TVariable *>(symbolTable.findGlobal(name));
ASSERT(structInfo);
TIntermSymbol *symbol = new TIntermSymbol(0, name, structInfo->getType());
@@ -125,12 +83,14 @@
} // namespace anonymous
-void InitializeVariables(TIntermNode *root,
+void InitializeVariables(TIntermBlock *root,
const InitVariableList &vars,
const TSymbolTable &symbolTable)
{
- VariableInitializer initializer(vars, symbolTable);
- root->traverse(&initializer);
+ TIntermFunctionDefinition *main = FindMain(root);
+ ASSERT(main != nullptr);
+ TIntermBlock *body = main->getBody();
+ InsertInitCode(body->getSequence(), vars, symbolTable);
}
} // namespace sh