summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/IntermTraverse.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/IntermTraverse.h')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/IntermTraverse.h355
1 files changed, 0 insertions, 355 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/IntermTraverse.h b/src/3rdparty/angle/src/compiler/translator/IntermTraverse.h
deleted file mode 100644
index f0300b586b..0000000000
--- a/src/3rdparty/angle/src/compiler/translator/IntermTraverse.h
+++ /dev/null
@@ -1,355 +0,0 @@
-//
-// Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// IntermTraverse.h : base classes for AST traversers that walk the AST and
-// also have the ability to transform it by replacing nodes.
-
-#ifndef COMPILER_TRANSLATOR_INTERMTRAVERSE_H_
-#define COMPILER_TRANSLATOR_INTERMTRAVERSE_H_
-
-#include "compiler/translator/IntermNode.h"
-
-namespace sh
-{
-
-class TSymbolTable;
-class TSymbolUniqueId;
-
-enum Visit
-{
- PreVisit,
- InVisit,
- PostVisit
-};
-
-// For traversing the tree. User should derive from this class overriding the visit functions,
-// and then pass an object of the subclass to a traverse method of a node.
-//
-// The traverse*() functions may also be overridden to do other bookkeeping on the tree to provide
-// contextual information to the visit functions, such as whether the node is the target of an
-// assignment. This is complex to maintain and so should only be done in special cases.
-//
-// When using this, just fill in the methods for nodes you want visited.
-// Return false from a pre-visit to skip visiting that node's subtree.
-class TIntermTraverser : angle::NonCopyable
-{
- public:
- POOL_ALLOCATOR_NEW_DELETE();
- TIntermTraverser(bool preVisit,
- bool inVisit,
- bool postVisit,
- TSymbolTable *symbolTable = nullptr);
- virtual ~TIntermTraverser();
-
- virtual void visitSymbol(TIntermSymbol *node) {}
- virtual void visitRaw(TIntermRaw *node) {}
- virtual void visitConstantUnion(TIntermConstantUnion *node) {}
- virtual bool visitSwizzle(Visit visit, TIntermSwizzle *node) { return true; }
- virtual bool visitBinary(Visit visit, TIntermBinary *node) { return true; }
- virtual bool visitUnary(Visit visit, TIntermUnary *node) { return true; }
- virtual bool visitTernary(Visit visit, TIntermTernary *node) { return true; }
- virtual bool visitIfElse(Visit visit, TIntermIfElse *node) { return true; }
- virtual bool visitSwitch(Visit visit, TIntermSwitch *node) { return true; }
- virtual bool visitCase(Visit visit, TIntermCase *node) { return true; }
- virtual bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node)
- {
- return true;
- }
- virtual bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node)
- {
- return true;
- }
- virtual bool visitAggregate(Visit visit, TIntermAggregate *node) { return true; }
- virtual bool visitBlock(Visit visit, TIntermBlock *node) { return true; }
- virtual bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
- {
- return true;
- }
- virtual bool visitDeclaration(Visit visit, TIntermDeclaration *node) { return true; }
- virtual bool visitLoop(Visit visit, TIntermLoop *node) { return true; }
- virtual bool visitBranch(Visit visit, TIntermBranch *node) { return true; }
-
- // The traverse functions contain logic for iterating over the children of the node
- // and calling the visit functions in the appropriate places. They also track some
- // context that may be used by the visit functions.
- virtual void traverseSymbol(TIntermSymbol *node);
- virtual void traverseRaw(TIntermRaw *node);
- virtual void traverseConstantUnion(TIntermConstantUnion *node);
- virtual void traverseSwizzle(TIntermSwizzle *node);
- virtual void traverseBinary(TIntermBinary *node);
- virtual void traverseUnary(TIntermUnary *node);
- virtual void traverseTernary(TIntermTernary *node);
- virtual void traverseIfElse(TIntermIfElse *node);
- virtual void traverseSwitch(TIntermSwitch *node);
- virtual void traverseCase(TIntermCase *node);
- virtual void traverseFunctionPrototype(TIntermFunctionPrototype *node);
- virtual void traverseFunctionDefinition(TIntermFunctionDefinition *node);
- virtual void traverseAggregate(TIntermAggregate *node);
- virtual void traverseBlock(TIntermBlock *node);
- virtual void traverseInvariantDeclaration(TIntermInvariantDeclaration *node);
- virtual void traverseDeclaration(TIntermDeclaration *node);
- virtual void traverseLoop(TIntermLoop *node);
- virtual void traverseBranch(TIntermBranch *node);
-
- int getMaxDepth() const { return mMaxDepth; }
-
- // If traversers need to replace nodes, they can add the replacements in
- // mReplacements/mMultiReplacements during traversal and the user of the traverser should call
- // this function after traversal to perform them.
- void updateTree();
-
- protected:
- // Should only be called from traverse*() functions
- void incrementDepth(TIntermNode *current)
- {
- mDepth++;
- mMaxDepth = std::max(mMaxDepth, mDepth);
- mPath.push_back(current);
- }
-
- // Should only be called from traverse*() functions
- void decrementDepth()
- {
- mDepth--;
- mPath.pop_back();
- }
-
- // RAII helper for incrementDepth/decrementDepth
- class ScopedNodeInTraversalPath
- {
- public:
- ScopedNodeInTraversalPath(TIntermTraverser *traverser, TIntermNode *current)
- : mTraverser(traverser)
- {
- mTraverser->incrementDepth(current);
- }
- ~ScopedNodeInTraversalPath() { mTraverser->decrementDepth(); }
-
- private:
- TIntermTraverser *mTraverser;
- };
-
- TIntermNode *getParentNode() { return mPath.size() <= 1 ? nullptr : mPath[mPath.size() - 2u]; }
-
- // Return the nth ancestor of the node being traversed. getAncestorNode(0) == getParentNode()
- TIntermNode *getAncestorNode(unsigned int n)
- {
- if (mPath.size() > n + 1u)
- {
- return mPath[mPath.size() - n - 2u];
- }
- return nullptr;
- }
-
- const TIntermBlock *getParentBlock() const;
-
- void pushParentBlock(TIntermBlock *node);
- void incrementParentBlockPos();
- void popParentBlock();
-
- // To replace a single node with multiple nodes in the parent aggregate. May be used with blocks
- // but also with other nodes like declarations.
- struct NodeReplaceWithMultipleEntry
- {
- NodeReplaceWithMultipleEntry(TIntermAggregateBase *_parent,
- TIntermNode *_original,
- TIntermSequence _replacements)
- : parent(_parent), original(_original), replacements(_replacements)
- {
- }
-
- TIntermAggregateBase *parent;
- TIntermNode *original;
- TIntermSequence replacements;
- };
-
- // Helper to insert statements in the parent block of the node currently being traversed.
- // The statements will be inserted before the node being traversed once updateTree is called.
- // Should only be called during PreVisit or PostVisit if called from block nodes.
- // Note that two insertions to the same position in the same block are not supported.
- void insertStatementsInParentBlock(const TIntermSequence &insertions);
-
- // Same as above, but supports simultaneous insertion of statements before and after the node
- // currently being traversed.
- void insertStatementsInParentBlock(const TIntermSequence &insertionsBefore,
- const TIntermSequence &insertionsAfter);
-
- // Helper to insert a single statement.
- void insertStatementInParentBlock(TIntermNode *statement);
-
- // Helper to create a temporary symbol node with the given qualifier.
- TIntermSymbol *createTempSymbol(const TType &type, TQualifier qualifier);
- // Helper to create a temporary symbol node.
- TIntermSymbol *createTempSymbol(const TType &type);
- // Create a node that declares but doesn't initialize a temporary symbol.
- TIntermDeclaration *createTempDeclaration(const TType &type);
- // Create a node that initializes the current temporary symbol with initializer. The symbol will
- // have the given qualifier.
- TIntermDeclaration *createTempInitDeclaration(TIntermTyped *initializer, TQualifier qualifier);
- // Create a node that initializes the current temporary symbol with initializer.
- TIntermDeclaration *createTempInitDeclaration(TIntermTyped *initializer);
- // Create a node that assigns rightNode to the current temporary symbol.
- TIntermBinary *createTempAssignment(TIntermTyped *rightNode);
- // Increment temporary symbol index.
- void nextTemporaryId();
-
- enum class OriginalNode
- {
- BECOMES_CHILD,
- IS_DROPPED
- };
-
- void clearReplacementQueue();
-
- // Replace the node currently being visited with replacement.
- void queueReplacement(TIntermNode *replacement, OriginalNode originalStatus);
- // Explicitly specify a node to replace with replacement.
- void queueReplacementWithParent(TIntermNode *parent,
- TIntermNode *original,
- TIntermNode *replacement,
- OriginalNode originalStatus);
-
- const bool preVisit;
- const bool inVisit;
- const bool postVisit;
-
- int mDepth;
- int mMaxDepth;
-
- bool mInGlobalScope;
-
- // During traversing, save all the changes that need to happen into
- // mReplacements/mMultiReplacements, then do them by calling updateTree().
- // Multi replacements are processed after single replacements.
- std::vector<NodeReplaceWithMultipleEntry> mMultiReplacements;
-
- TSymbolTable *mSymbolTable;
-
- private:
- // To insert multiple nodes into the parent block.
- struct NodeInsertMultipleEntry
- {
- NodeInsertMultipleEntry(TIntermBlock *_parent,
- TIntermSequence::size_type _position,
- TIntermSequence _insertionsBefore,
- TIntermSequence _insertionsAfter)
- : parent(_parent),
- position(_position),
- insertionsBefore(_insertionsBefore),
- insertionsAfter(_insertionsAfter)
- {
- }
-
- TIntermBlock *parent;
- TIntermSequence::size_type position;
- TIntermSequence insertionsBefore;
- TIntermSequence insertionsAfter;
- };
-
- static bool CompareInsertion(const NodeInsertMultipleEntry &a,
- const NodeInsertMultipleEntry &b);
-
- // To replace a single node with another on the parent node
- struct NodeUpdateEntry
- {
- NodeUpdateEntry(TIntermNode *_parent,
- TIntermNode *_original,
- TIntermNode *_replacement,
- bool _originalBecomesChildOfReplacement)
- : parent(_parent),
- original(_original),
- replacement(_replacement),
- originalBecomesChildOfReplacement(_originalBecomesChildOfReplacement)
- {
- }
-
- TIntermNode *parent;
- TIntermNode *original;
- TIntermNode *replacement;
- bool originalBecomesChildOfReplacement;
- };
-
- struct ParentBlock
- {
- ParentBlock(TIntermBlock *nodeIn, TIntermSequence::size_type posIn)
- : node(nodeIn), pos(posIn)
- {
- }
-
- TIntermBlock *node;
- TIntermSequence::size_type pos;
- };
-
- std::vector<NodeInsertMultipleEntry> mInsertions;
- std::vector<NodeUpdateEntry> mReplacements;
-
- // All the nodes from root to the current node during traversing.
- TVector<TIntermNode *> mPath;
-
- // All the code blocks from the root to the current node's parent during traversal.
- std::vector<ParentBlock> mParentBlockStack;
-
- TSymbolUniqueId *mTemporaryId;
-};
-
-// Traverser parent class that tracks where a node is a destination of a write operation and so is
-// required to be an l-value.
-class TLValueTrackingTraverser : public TIntermTraverser
-{
- public:
- TLValueTrackingTraverser(bool preVisit,
- bool inVisit,
- bool postVisit,
- TSymbolTable *symbolTable,
- int shaderVersion);
- virtual ~TLValueTrackingTraverser() {}
-
- void traverseBinary(TIntermBinary *node) final;
- void traverseUnary(TIntermUnary *node) final;
- void traverseFunctionPrototype(TIntermFunctionPrototype *node) final;
- void traverseAggregate(TIntermAggregate *node) final;
-
- protected:
- bool isLValueRequiredHere() const
- {
- return mOperatorRequiresLValue || mInFunctionCallOutParameter;
- }
-
- private:
- // Track whether an l-value is required in the node that is currently being traversed by the
- // surrounding operator.
- // Use isLValueRequiredHere to check all conditions which require an l-value.
- void setOperatorRequiresLValue(bool lValueRequired)
- {
- mOperatorRequiresLValue = lValueRequired;
- }
- bool operatorRequiresLValue() const { return mOperatorRequiresLValue; }
-
- // Add a function encountered during traversal to the function map.
- void addToFunctionMap(const TSymbolUniqueId &id, TIntermSequence *paramSequence);
-
- // Return true if the prototype or definition of the function being called has been encountered
- // during traversal.
- bool isInFunctionMap(const TIntermAggregate *callNode) const;
-
- // Return the parameters sequence from the function definition or prototype.
- TIntermSequence *getFunctionParameters(const TIntermAggregate *callNode);
-
- // Track whether an l-value is required inside a function call.
- void setInFunctionCallOutParameter(bool inOutParameter);
- bool isInFunctionCallOutParameter() const;
-
- bool mOperatorRequiresLValue;
- bool mInFunctionCallOutParameter;
-
- // Map from function symbol id values to their parameter sequences
- TMap<int, TIntermSequence *> mFunctionMap;
-
- const int mShaderVersion;
-};
-
-} // namespace sh
-
-#endif // COMPILER_TRANSLATOR_INTERMTRAVERSE_H_