diff options
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/IntermNode.h')
-rw-r--r-- | src/3rdparty/angle/src/compiler/translator/IntermNode.h | 917 |
1 files changed, 0 insertions, 917 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/IntermNode.h b/src/3rdparty/angle/src/compiler/translator/IntermNode.h deleted file mode 100644 index 2170916201..0000000000 --- a/src/3rdparty/angle/src/compiler/translator/IntermNode.h +++ /dev/null @@ -1,917 +0,0 @@ -// -// Copyright (c) 2002-2014 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. -// - -// -// Definition of the in-memory high-level intermediate representation -// of shaders. This is a tree that parser creates. -// -// Nodes in the tree are defined as a hierarchy of classes derived from -// TIntermNode. Each is a node in a tree. There is no preset branching factor; -// each node can have it's own type of list of children. -// - -#ifndef COMPILER_TRANSLATOR_INTERMNODE_H_ -#define COMPILER_TRANSLATOR_INTERMNODE_H_ - -#include "GLSLANG/ShaderLang.h" - -#include <algorithm> -#include <queue> - -#include "common/angleutils.h" -#include "compiler/translator/Common.h" -#include "compiler/translator/ConstantUnion.h" -#include "compiler/translator/Operator.h" -#include "compiler/translator/SymbolUniqueId.h" -#include "compiler/translator/Types.h" - -namespace sh -{ - -class TDiagnostics; - -class TIntermTraverser; -class TIntermAggregate; -class TIntermBlock; -class TIntermInvariantDeclaration; -class TIntermDeclaration; -class TIntermFunctionPrototype; -class TIntermFunctionDefinition; -class TIntermSwizzle; -class TIntermBinary; -class TIntermUnary; -class TIntermConstantUnion; -class TIntermTernary; -class TIntermIfElse; -class TIntermSwitch; -class TIntermCase; -class TIntermTyped; -class TIntermSymbol; -class TIntermLoop; -class TInfoSink; -class TInfoSinkBase; -class TIntermRaw; -class TIntermBranch; - -class TSymbolTable; -class TFunction; - -// Encapsulate an identifier string and track whether it is coming from the original shader code -// (not internal) or from ANGLE (internal). Usually internal names shouldn't be decorated or hashed. -class TName -{ - public: - POOL_ALLOCATOR_NEW_DELETE(); - explicit TName(const TString &name) : mName(name), mIsInternal(false) {} - TName() : mName(), mIsInternal(false) {} - TName(const TName &) = default; - TName &operator=(const TName &) = default; - - const TString &getString() const { return mName; } - void setString(const TString &string) { mName = string; } - bool isInternal() const { return mIsInternal; } - void setInternal(bool isInternal) { mIsInternal = isInternal; } - - private: - TString mName; - bool mIsInternal; -}; - -// -// Base class for the tree nodes -// -class TIntermNode : angle::NonCopyable -{ - public: - POOL_ALLOCATOR_NEW_DELETE(); - TIntermNode() - { - // TODO: Move this to TSourceLoc constructor - // after getting rid of TPublicType. - mLine.first_file = mLine.last_file = 0; - mLine.first_line = mLine.last_line = 0; - } - virtual ~TIntermNode() {} - - const TSourceLoc &getLine() const { return mLine; } - void setLine(const TSourceLoc &l) { mLine = l; } - - virtual void traverse(TIntermTraverser *) = 0; - virtual TIntermTyped *getAsTyped() { return 0; } - virtual TIntermConstantUnion *getAsConstantUnion() { return 0; } - virtual TIntermFunctionDefinition *getAsFunctionDefinition() { return nullptr; } - virtual TIntermAggregate *getAsAggregate() { return 0; } - virtual TIntermBlock *getAsBlock() { return nullptr; } - virtual TIntermFunctionPrototype *getAsFunctionPrototypeNode() { return nullptr; } - virtual TIntermInvariantDeclaration *getAsInvariantDeclarationNode() { return nullptr; } - virtual TIntermDeclaration *getAsDeclarationNode() { return nullptr; } - virtual TIntermSwizzle *getAsSwizzleNode() { return nullptr; } - virtual TIntermBinary *getAsBinaryNode() { return 0; } - virtual TIntermUnary *getAsUnaryNode() { return 0; } - virtual TIntermTernary *getAsTernaryNode() { return nullptr; } - virtual TIntermIfElse *getAsIfElseNode() { return nullptr; } - virtual TIntermSwitch *getAsSwitchNode() { return 0; } - virtual TIntermCase *getAsCaseNode() { return 0; } - virtual TIntermSymbol *getAsSymbolNode() { return 0; } - virtual TIntermLoop *getAsLoopNode() { return 0; } - virtual TIntermRaw *getAsRawNode() { return 0; } - virtual TIntermBranch *getAsBranchNode() { return 0; } - - // Replace a child node. Return true if |original| is a child - // node and it is replaced; otherwise, return false. - virtual bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) = 0; - - protected: - TSourceLoc mLine; -}; - -// -// This is just to help yacc. -// -struct TIntermNodePair -{ - TIntermNode *node1; - TIntermNode *node2; -}; - -// -// Intermediate class for nodes that have a type. -// -class TIntermTyped : public TIntermNode -{ - public: - TIntermTyped(const TType &t) : mType(t) {} - - virtual TIntermTyped *deepCopy() const = 0; - - TIntermTyped *getAsTyped() override { return this; } - - // True if executing the expression represented by this node affects state, like values of - // variables. False if the executing the expression only computes its return value without - // affecting state. May return true conservatively. - virtual bool hasSideEffects() const = 0; - - void setType(const TType &t) { mType = t; } - void setTypePreservePrecision(const TType &t); - const TType &getType() const { return mType; } - TType *getTypePointer() { return &mType; } - - TBasicType getBasicType() const { return mType.getBasicType(); } - TQualifier getQualifier() const { return mType.getQualifier(); } - TPrecision getPrecision() const { return mType.getPrecision(); } - TMemoryQualifier getMemoryQualifier() const { return mType.getMemoryQualifier(); } - int getCols() const { return mType.getCols(); } - int getRows() const { return mType.getRows(); } - int getNominalSize() const { return mType.getNominalSize(); } - int getSecondarySize() const { return mType.getSecondarySize(); } - - bool isInterfaceBlock() const { return mType.isInterfaceBlock(); } - bool isMatrix() const { return mType.isMatrix(); } - bool isArray() const { return mType.isArray(); } - bool isVector() const { return mType.isVector(); } - bool isScalar() const { return mType.isScalar(); } - bool isScalarInt() const { return mType.isScalarInt(); } - const char *getBasicString() const { return mType.getBasicString(); } - TString getCompleteString() const { return mType.getCompleteString(); } - - unsigned int getOutermostArraySize() const { return mType.getOutermostArraySize(); } - - bool isConstructorWithOnlyConstantUnionParameters(); - - protected: - TType mType; - - TIntermTyped(const TIntermTyped &node); -}; - -// -// Handle for, do-while, and while loops. -// -enum TLoopType -{ - ELoopFor, - ELoopWhile, - ELoopDoWhile -}; - -class TIntermLoop : public TIntermNode -{ - public: - TIntermLoop(TLoopType type, - TIntermNode *init, - TIntermTyped *cond, - TIntermTyped *expr, - TIntermBlock *body); - - TIntermLoop *getAsLoopNode() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TLoopType getType() const { return mType; } - TIntermNode *getInit() { return mInit; } - TIntermTyped *getCondition() { return mCond; } - TIntermTyped *getExpression() { return mExpr; } - TIntermBlock *getBody() { return mBody; } - - void setInit(TIntermNode *init) { mInit = init; } - void setCondition(TIntermTyped *condition) { mCond = condition; } - void setExpression(TIntermTyped *expression) { mExpr = expression; } - void setBody(TIntermBlock *body) { mBody = body; } - - protected: - TLoopType mType; - TIntermNode *mInit; // for-loop initialization - TIntermTyped *mCond; // loop exit condition - TIntermTyped *mExpr; // for-loop expression - TIntermBlock *mBody; // loop body -}; - -// -// Handle break, continue, return, and kill. -// -class TIntermBranch : public TIntermNode -{ - public: - TIntermBranch(TOperator op, TIntermTyped *e) : mFlowOp(op), mExpression(e) {} - - void traverse(TIntermTraverser *it) override; - TIntermBranch *getAsBranchNode() override { return this; } - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TOperator getFlowOp() { return mFlowOp; } - TIntermTyped *getExpression() { return mExpression; } - - protected: - TOperator mFlowOp; - TIntermTyped *mExpression; // non-zero except for "return exp;" statements -}; - -// -// Nodes that correspond to symbols or constants in the source code. -// -class TIntermSymbol : public TIntermTyped -{ - public: - // if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. - // If sym comes from per process globalpoolallocator, then it causes increased memory usage - // per compile it is essential to use "symbol = sym" to assign to symbol - TIntermSymbol(const TSymbolUniqueId &id, const TString &symbol, const TType &type) - : TIntermTyped(type), mId(id), mSymbol(symbol) - { - } - - TIntermTyped *deepCopy() const override { return new TIntermSymbol(*this); } - - bool hasSideEffects() const override { return false; } - - int getId() const { return mId.get(); } - const TString &getSymbol() const { return mSymbol.getString(); } - const TName &getName() const { return mSymbol; } - TName &getName() { return mSymbol; } - - void setInternal(bool internal) { mSymbol.setInternal(internal); } - - void traverse(TIntermTraverser *it) override; - TIntermSymbol *getAsSymbolNode() override { return this; } - bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } - - protected: - const TSymbolUniqueId mId; - TName mSymbol; - - private: - TIntermSymbol(const TIntermSymbol &) = default; // Note: not deleted, just private! -}; - -// A Raw node stores raw code, that the translator will insert verbatim -// into the output stream. Useful for transformation operations that make -// complex code that might not fit naturally into the GLSL model. -class TIntermRaw : public TIntermTyped -{ - public: - TIntermRaw(const TType &type, const TString &rawText) : TIntermTyped(type), mRawText(rawText) {} - TIntermRaw(const TIntermRaw &) = delete; - - TIntermTyped *deepCopy() const override - { - UNREACHABLE(); - return nullptr; - } - - bool hasSideEffects() const override { return false; } - - TString getRawText() const { return mRawText; } - - void traverse(TIntermTraverser *it) override; - - TIntermRaw *getAsRawNode() override { return this; } - bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } - - protected: - TString mRawText; -}; - -// Constant folded node. -// Note that nodes may be constant folded and not be constant expressions with the EvqConst -// qualifier. This happens for example when the following expression is processed: -// "true ? 1.0 : non_constant" -// Other nodes than TIntermConstantUnion may also be constant expressions. -// -class TIntermConstantUnion : public TIntermTyped -{ - public: - TIntermConstantUnion(const TConstantUnion *unionPointer, const TType &type) - : TIntermTyped(type), mUnionArrayPointer(unionPointer) - { - ASSERT(unionPointer); - } - - TIntermTyped *deepCopy() const override { return new TIntermConstantUnion(*this); } - - bool hasSideEffects() const override { return false; } - - const TConstantUnion *getUnionArrayPointer() const { return mUnionArrayPointer; } - - int getIConst(size_t index) const - { - return mUnionArrayPointer ? mUnionArrayPointer[index].getIConst() : 0; - } - unsigned int getUConst(size_t index) const - { - return mUnionArrayPointer ? mUnionArrayPointer[index].getUConst() : 0; - } - float getFConst(size_t index) const - { - return mUnionArrayPointer ? mUnionArrayPointer[index].getFConst() : 0.0f; - } - bool getBConst(size_t index) const - { - return mUnionArrayPointer ? mUnionArrayPointer[index].getBConst() : false; - } - - void replaceConstantUnion(const TConstantUnion *safeConstantUnion) - { - ASSERT(safeConstantUnion); - // Previous union pointer freed on pool deallocation. - mUnionArrayPointer = safeConstantUnion; - } - - TIntermConstantUnion *getAsConstantUnion() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; } - - TConstantUnion *foldBinary(TOperator op, - TIntermConstantUnion *rightNode, - TDiagnostics *diagnostics, - const TSourceLoc &line); - const TConstantUnion *foldIndexing(int index); - TConstantUnion *foldUnaryNonComponentWise(TOperator op); - TConstantUnion *foldUnaryComponentWise(TOperator op, TDiagnostics *diagnostics); - - static TConstantUnion *FoldAggregateConstructor(TIntermAggregate *aggregate); - static TConstantUnion *FoldAggregateBuiltIn(TIntermAggregate *aggregate, - TDiagnostics *diagnostics); - - protected: - // Same data may be shared between multiple constant unions, so it can't be modified. - const TConstantUnion *mUnionArrayPointer; - - private: - typedef float (*FloatTypeUnaryFunc)(float); - void foldFloatTypeUnary(const TConstantUnion ¶meter, - FloatTypeUnaryFunc builtinFunc, - TConstantUnion *result) const; - - TIntermConstantUnion(const TIntermConstantUnion &node); // Note: not deleted, just private! -}; - -// -// Intermediate class for node types that hold operators. -// -class TIntermOperator : public TIntermTyped -{ - public: - TOperator getOp() const { return mOp; } - - bool isAssignment() const; - bool isMultiplication() const; - bool isConstructor() const; - - // Returns true for calls mapped to EOpCall*, false for built-ins that have their own specific - // ops. - bool isFunctionCall() const; - - bool hasSideEffects() const override { return isAssignment(); } - - protected: - TIntermOperator(TOperator op) : TIntermTyped(TType(EbtFloat, EbpUndefined)), mOp(op) {} - TIntermOperator(TOperator op, const TType &type) : TIntermTyped(type), mOp(op) {} - - TIntermOperator(const TIntermOperator &) = default; - - const TOperator mOp; -}; - -// Node for vector swizzles. -class TIntermSwizzle : public TIntermTyped -{ - public: - // This constructor determines the type of the node based on the operand. - TIntermSwizzle(TIntermTyped *operand, const TVector<int> &swizzleOffsets); - - TIntermTyped *deepCopy() const override { return new TIntermSwizzle(*this); } - - TIntermSwizzle *getAsSwizzleNode() override { return this; }; - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - bool hasSideEffects() const override { return mOperand->hasSideEffects(); } - - TIntermTyped *getOperand() { return mOperand; } - void writeOffsetsAsXYZW(TInfoSinkBase *out) const; - - bool hasDuplicateOffsets() const; - bool offsetsMatch(int offset) const; - - TIntermTyped *fold(); - - protected: - TIntermTyped *mOperand; - TVector<int> mSwizzleOffsets; - - private: - void promote(); - - TIntermSwizzle(const TIntermSwizzle &node); // Note: not deleted, just private! -}; - -// -// Nodes for all the basic binary math operators. -// -class TIntermBinary : public TIntermOperator -{ - public: - // This constructor determines the type of the binary node based on the operands and op. - TIntermBinary(TOperator op, TIntermTyped *left, TIntermTyped *right); - - TIntermTyped *deepCopy() const override { return new TIntermBinary(*this); } - - static TOperator GetMulOpBasedOnOperands(const TType &left, const TType &right); - static TOperator GetMulAssignOpBasedOnOperands(const TType &left, const TType &right); - static TQualifier GetCommaQualifier(int shaderVersion, - const TIntermTyped *left, - const TIntermTyped *right); - - TIntermBinary *getAsBinaryNode() override { return this; }; - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - bool hasSideEffects() const override - { - return isAssignment() || mLeft->hasSideEffects() || mRight->hasSideEffects(); - } - - TIntermTyped *getLeft() const { return mLeft; } - TIntermTyped *getRight() const { return mRight; } - TIntermTyped *fold(TDiagnostics *diagnostics); - - void setAddIndexClamp() { mAddIndexClamp = true; } - bool getAddIndexClamp() { return mAddIndexClamp; } - - protected: - TIntermTyped *mLeft; - TIntermTyped *mRight; - - // If set to true, wrap any EOpIndexIndirect with a clamp to bounds. - bool mAddIndexClamp; - - private: - void promote(); - - TIntermBinary(const TIntermBinary &node); // Note: not deleted, just private! -}; - -// -// Nodes for unary math operators. -// -class TIntermUnary : public TIntermOperator -{ - public: - TIntermUnary(TOperator op, TIntermTyped *operand); - - TIntermTyped *deepCopy() const override { return new TIntermUnary(*this); } - - void traverse(TIntermTraverser *it) override; - TIntermUnary *getAsUnaryNode() override { return this; } - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - bool hasSideEffects() const override { return isAssignment() || mOperand->hasSideEffects(); } - - TIntermTyped *getOperand() { return mOperand; } - TIntermTyped *fold(TDiagnostics *diagnostics); - - void setUseEmulatedFunction() { mUseEmulatedFunction = true; } - bool getUseEmulatedFunction() { return mUseEmulatedFunction; } - - protected: - TIntermTyped *mOperand; - - // If set to true, replace the built-in function call with an emulated one - // to work around driver bugs. - bool mUseEmulatedFunction; - - private: - void promote(); - - TIntermUnary(const TIntermUnary &node); // note: not deleted, just private! -}; - -class TFunctionSymbolInfo -{ - public: - POOL_ALLOCATOR_NEW_DELETE(); - TFunctionSymbolInfo(const TSymbolUniqueId &id); - TFunctionSymbolInfo() : mId(nullptr), mKnownToNotHaveSideEffects(false) {} - - TFunctionSymbolInfo(const TFunctionSymbolInfo &info); - TFunctionSymbolInfo &operator=(const TFunctionSymbolInfo &info); - - void setFromFunction(const TFunction &function); - - void setNameObj(const TName &name) { mName = name; } - const TName &getNameObj() const { return mName; } - - const TString &getName() const { return mName.getString(); } - void setName(const TString &name) { mName.setString(name); } - bool isMain() const { return mName.getString() == "main"; } - - void setKnownToNotHaveSideEffects(bool knownToNotHaveSideEffects) - { - mKnownToNotHaveSideEffects = knownToNotHaveSideEffects; - } - bool isKnownToNotHaveSideEffects() const { return mKnownToNotHaveSideEffects; } - - void setId(const TSymbolUniqueId &functionId); - const TSymbolUniqueId &getId() const; - - bool isImageFunction() const - { - return getName() == "imageSize" || getName() == "imageLoad" || getName() == "imageStore"; - } - - private: - TName mName; - TSymbolUniqueId *mId; - bool mKnownToNotHaveSideEffects; -}; - -typedef TVector<TIntermNode *> TIntermSequence; -typedef TVector<int> TQualifierList; - -// -// This is just to help yacc. -// -struct TIntermFunctionCallOrMethod -{ - TIntermSequence *arguments; - TIntermNode *thisNode; -}; - -// Interface for node classes that have an arbitrarily sized set of children. -class TIntermAggregateBase -{ - public: - virtual ~TIntermAggregateBase() {} - - virtual TIntermSequence *getSequence() = 0; - virtual const TIntermSequence *getSequence() const = 0; - - bool replaceChildNodeWithMultiple(TIntermNode *original, const TIntermSequence &replacements); - bool insertChildNodes(TIntermSequence::size_type position, const TIntermSequence &insertions); - - protected: - TIntermAggregateBase() {} - - bool replaceChildNodeInternal(TIntermNode *original, TIntermNode *replacement); -}; - -// -// Nodes that operate on an arbitrary sized set of children. -// -class TIntermAggregate : public TIntermOperator, public TIntermAggregateBase -{ - public: - static TIntermAggregate *CreateFunctionCall(const TFunction &func, TIntermSequence *arguments); - - // If using this, ensure that there's a consistent function definition with the same symbol id - // added to the AST. - static TIntermAggregate *CreateFunctionCall(const TType &type, - const TSymbolUniqueId &id, - const TName &name, - TIntermSequence *arguments); - - static TIntermAggregate *CreateBuiltInFunctionCall(const TFunction &func, - TIntermSequence *arguments); - static TIntermAggregate *CreateConstructor(const TType &type, - TIntermSequence *arguments); - static TIntermAggregate *Create(const TType &type, TOperator op, TIntermSequence *arguments); - ~TIntermAggregate() {} - - // Note: only supported for nodes that can be a part of an expression. - TIntermTyped *deepCopy() const override { return new TIntermAggregate(*this); } - - TIntermAggregate *shallowCopy() const; - - TIntermAggregate *getAsAggregate() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - bool hasSideEffects() const override; - - static bool CanFoldAggregateBuiltInOp(TOperator op); - TIntermTyped *fold(TDiagnostics *diagnostics); - - TIntermSequence *getSequence() override { return &mArguments; } - const TIntermSequence *getSequence() const override { return &mArguments; } - - TString getSymbolTableMangledName() const; - - void setUseEmulatedFunction() { mUseEmulatedFunction = true; } - bool getUseEmulatedFunction() { return mUseEmulatedFunction; } - - // Returns true if changing parameter precision may affect the return value. - bool gotPrecisionFromChildren() const { return mGotPrecisionFromChildren; } - - TFunctionSymbolInfo *getFunctionSymbolInfo() { return &mFunctionInfo; } - const TFunctionSymbolInfo *getFunctionSymbolInfo() const { return &mFunctionInfo; } - - protected: - TIntermSequence mArguments; - - // If set to true, replace the built-in function call with an emulated one - // to work around driver bugs. Only for calls mapped to ops other than EOpCall*. - bool mUseEmulatedFunction; - - bool mGotPrecisionFromChildren; - - TFunctionSymbolInfo mFunctionInfo; - - private: - TIntermAggregate(const TType &type, TOperator op, TIntermSequence *arguments); - - TIntermAggregate(const TIntermAggregate &node); // note: not deleted, just private! - - void setTypePrecisionAndQualifier(const TType &type); - - bool areChildrenConstQualified(); - - void setPrecisionFromChildren(); - - void setPrecisionForBuiltInOp(); - - // Returns true if precision was set according to special rules for this built-in. - bool setPrecisionForSpecialBuiltInOp(); - - // Used for built-in functions under EOpCallBuiltInFunction. The function name in the symbol - // info needs to be set before calling this. - void setBuiltInFunctionPrecision(); -}; - -// A list of statements. Either the root node which contains declarations and function definitions, -// or a block that can be marked with curly braces {}. -class TIntermBlock : public TIntermNode, public TIntermAggregateBase -{ - public: - TIntermBlock() : TIntermNode() {} - ~TIntermBlock() {} - - TIntermBlock *getAsBlock() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - // Only intended for initially building the block. - void appendStatement(TIntermNode *statement); - - TIntermSequence *getSequence() override { return &mStatements; } - const TIntermSequence *getSequence() const override { return &mStatements; } - - protected: - TIntermSequence mStatements; -}; - -// Function prototype. May be in the AST either as a function prototype declaration or as a part of -// a function definition. The type of the node is the function return type. -class TIntermFunctionPrototype : public TIntermTyped, public TIntermAggregateBase -{ - public: - // TODO(oetuaho@nvidia.com): See if TFunctionSymbolInfo could be added to constructor - // parameters. - TIntermFunctionPrototype(const TType &type, const TSymbolUniqueId &id) - : TIntermTyped(type), mFunctionInfo(id) - { - } - ~TIntermFunctionPrototype() {} - - TIntermFunctionPrototype *getAsFunctionPrototypeNode() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermTyped *deepCopy() const override - { - UNREACHABLE(); - return nullptr; - } - bool hasSideEffects() const override - { - UNREACHABLE(); - return true; - } - - // Only intended for initially building the declaration. - void appendParameter(TIntermSymbol *parameter); - - TIntermSequence *getSequence() override { return &mParameters; } - const TIntermSequence *getSequence() const override { return &mParameters; } - - TFunctionSymbolInfo *getFunctionSymbolInfo() { return &mFunctionInfo; } - const TFunctionSymbolInfo *getFunctionSymbolInfo() const { return &mFunctionInfo; } - - protected: - TIntermSequence mParameters; - - TFunctionSymbolInfo mFunctionInfo; -}; - -// Node for function definitions. The prototype child node stores the function header including -// parameters, and the body child node stores the function body. -class TIntermFunctionDefinition : public TIntermNode -{ - public: - TIntermFunctionDefinition(TIntermFunctionPrototype *prototype, TIntermBlock *body) - : TIntermNode(), mPrototype(prototype), mBody(body) - { - ASSERT(prototype != nullptr); - ASSERT(body != nullptr); - } - - TIntermFunctionDefinition *getAsFunctionDefinition() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermFunctionPrototype *getFunctionPrototype() const { return mPrototype; } - TIntermBlock *getBody() const { return mBody; } - - const TFunctionSymbolInfo *getFunctionSymbolInfo() const - { - return mPrototype->getFunctionSymbolInfo(); - } - - private: - TIntermFunctionPrototype *mPrototype; - TIntermBlock *mBody; -}; - -// Struct, interface block or variable declaration. Can contain multiple variable declarators. -class TIntermDeclaration : public TIntermNode, public TIntermAggregateBase -{ - public: - TIntermDeclaration() : TIntermNode() {} - ~TIntermDeclaration() {} - - TIntermDeclaration *getAsDeclarationNode() override { return this; } - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - // Only intended for initially building the declaration. - // The declarator node should be either TIntermSymbol or TIntermBinary with op set to - // EOpInitialize. - void appendDeclarator(TIntermTyped *declarator); - - TIntermSequence *getSequence() override { return &mDeclarators; } - const TIntermSequence *getSequence() const override { return &mDeclarators; } - protected: - TIntermSequence mDeclarators; -}; - -// Specialized declarations for attributing invariance. -class TIntermInvariantDeclaration : public TIntermNode -{ - public: - TIntermInvariantDeclaration(TIntermSymbol *symbol, const TSourceLoc &line); - - virtual TIntermInvariantDeclaration *getAsInvariantDeclarationNode() override { return this; } - - TIntermSymbol *getSymbol() { return mSymbol; } - - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - private: - TIntermSymbol *mSymbol; -}; - -// For ternary operators like a ? b : c. -class TIntermTernary : public TIntermTyped -{ - public: - TIntermTernary(TIntermTyped *cond, TIntermTyped *trueExpression, TIntermTyped *falseExpression); - - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermTyped *getCondition() const { return mCondition; } - TIntermTyped *getTrueExpression() const { return mTrueExpression; } - TIntermTyped *getFalseExpression() const { return mFalseExpression; } - TIntermTernary *getAsTernaryNode() override { return this; } - - TIntermTyped *deepCopy() const override { return new TIntermTernary(*this); } - - bool hasSideEffects() const override - { - return mCondition->hasSideEffects() || mTrueExpression->hasSideEffects() || - mFalseExpression->hasSideEffects(); - } - - TIntermTyped *fold(); - - private: - TIntermTernary(const TIntermTernary &node); // Note: not deleted, just private! - - static TQualifier DetermineQualifier(TIntermTyped *cond, - TIntermTyped *trueExpression, - TIntermTyped *falseExpression); - - TIntermTyped *mCondition; - TIntermTyped *mTrueExpression; - TIntermTyped *mFalseExpression; -}; - -class TIntermIfElse : public TIntermNode -{ - public: - TIntermIfElse(TIntermTyped *cond, TIntermBlock *trueB, TIntermBlock *falseB); - - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermTyped *getCondition() const { return mCondition; } - TIntermBlock *getTrueBlock() const { return mTrueBlock; } - TIntermBlock *getFalseBlock() const { return mFalseBlock; } - TIntermIfElse *getAsIfElseNode() override { return this; } - - protected: - TIntermTyped *mCondition; - TIntermBlock *mTrueBlock; - TIntermBlock *mFalseBlock; -}; - -// -// Switch statement. -// -class TIntermSwitch : public TIntermNode -{ - public: - TIntermSwitch(TIntermTyped *init, TIntermBlock *statementList); - - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermSwitch *getAsSwitchNode() override { return this; } - - TIntermTyped *getInit() { return mInit; } - TIntermBlock *getStatementList() { return mStatementList; } - - // Must be called with a non-null statementList. - void setStatementList(TIntermBlock *statementList); - - protected: - TIntermTyped *mInit; - TIntermBlock *mStatementList; -}; - -// -// Case label. -// -class TIntermCase : public TIntermNode -{ - public: - TIntermCase(TIntermTyped *condition) : TIntermNode(), mCondition(condition) {} - - void traverse(TIntermTraverser *it) override; - bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override; - - TIntermCase *getAsCaseNode() override { return this; } - - bool hasCondition() const { return mCondition != nullptr; } - TIntermTyped *getCondition() const { return mCondition; } - - protected: - TIntermTyped *mCondition; -}; - -} // namespace sh - -#endif // COMPILER_TRANSLATOR_INTERMNODE_H_ |