| //===- Operator.h ---------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_SCRIPT_OPERATOR_H_ |
| #define MCLD_SCRIPT_OPERATOR_H_ |
| |
| #include "mcld/Script/ExprToken.h" |
| #include <llvm/Support/DataTypes.h> |
| |
| namespace mcld { |
| |
| class IntOperand; |
| class Module; |
| class Operand; |
| class TargetLDBackend; |
| |
| /** \class Operator |
| * \brief This class defines the interfaces to an operator token. |
| */ |
| |
| class Operator : public ExprToken { |
| public: |
| enum Arity { NULLARY, UNARY, BINARY, TERNARY }; |
| |
| enum Type { |
| /* arithmetic operator */ |
| UNARY_PLUS = 0, |
| UNARY_MINUS = 1, |
| LOGICAL_NOT = 2, |
| BITWISE_NOT = 3, |
| MUL = 4, |
| DIV = 5, |
| MOD = 6, |
| ADD = 7, |
| SUB = 8, |
| LSHIFT = 9, |
| RSHIFT = 10, |
| LT = 11, |
| LE = 12, |
| GT = 13, |
| GE = 14, |
| EQ = 15, |
| NE = 16, |
| BITWISE_AND = 17, |
| BITWISE_XOR = 18, |
| BITWISE_OR = 19, |
| LOGICAL_AND = 20, |
| LOGICAL_OR = 21, |
| TERNARY_IF = 22, |
| ASSIGN = 23, |
| ADD_ASSIGN = 24, |
| SUB_ASSIGN = 25, |
| MUL_ASSIGN = 26, |
| DIV_ASSIGN = 27, |
| AND_ASSIGN = 28, |
| OR_ASSIGN = 29, |
| LS_ASSIGN = 30, |
| RS_ASSIGN = 31, |
| /* function */ |
| ABSOLUTE = 32, |
| ADDR = 33, |
| ALIGN = 34, |
| ALIGNOF = 35, |
| BLOCK = 36, |
| DATA_SEGMENT_ALIGN = 37, |
| DATA_SEGMENT_END = 38, |
| DATA_SEGMENT_RELRO_END = 39, |
| DEFINED = 40, |
| LENGTH = 41, |
| LOADADDR = 42, |
| MAX = 43, |
| MIN = 44, |
| NEXT = 45, |
| ORIGIN = 46, |
| SEGMENT_START = 47, |
| SIZEOF = 48, |
| SIZEOF_HEADERS = 49, |
| MAXPAGESIZE = 50, |
| COMMONPAGESIZE = 51 |
| }; |
| |
| static const char* OpNames[]; |
| |
| protected: |
| Operator(Arity pArity, Type pType); |
| |
| const IntOperand* result() const { return m_pIntOperand; } |
| IntOperand* result() { return m_pIntOperand; } |
| |
| public: |
| virtual ~Operator(); |
| |
| Arity arity() const { return m_Arity; } |
| |
| Type type() const { return m_Type; } |
| |
| virtual void dump() const; |
| |
| virtual IntOperand* eval(const Module& pModule, |
| const TargetLDBackend& pBackend) = 0; |
| |
| virtual void appendOperand(Operand* pOperand) = 0; |
| |
| static bool classof(const ExprToken* pToken) { |
| return pToken->kind() == ExprToken::OPERATOR; |
| } |
| |
| template <Operator::Type TYPE> |
| static Operator& create(); |
| |
| private: |
| Arity m_Arity; |
| Type m_Type; |
| IntOperand* m_pIntOperand; |
| }; |
| |
| /* Nullary operator */ |
| template <> |
| Operator& Operator::create<Operator::SIZEOF_HEADERS>(); |
| template <> |
| Operator& Operator::create<Operator::MAXPAGESIZE>(); |
| template <> |
| Operator& Operator::create<Operator::COMMONPAGESIZE>(); |
| |
| /* Unary operator */ |
| template <> |
| Operator& Operator::create<Operator::UNARY_PLUS>(); |
| template <> |
| Operator& Operator::create<Operator::UNARY_MINUS>(); |
| template <> |
| Operator& Operator::create<Operator::LOGICAL_NOT>(); |
| template <> |
| Operator& Operator::create<Operator::BITWISE_NOT>(); |
| |
| template <> |
| Operator& Operator::create<Operator::ABSOLUTE>(); |
| template <> |
| Operator& Operator::create<Operator::ADDR>(); |
| template <> |
| Operator& Operator::create<Operator::ALIGNOF>(); |
| template <> |
| Operator& Operator::create<Operator::DATA_SEGMENT_END>(); |
| template <> |
| Operator& Operator::create<Operator::DEFINED>(); |
| template <> |
| Operator& Operator::create<Operator::LENGTH>(); |
| template <> |
| Operator& Operator::create<Operator::LOADADDR>(); |
| template <> |
| Operator& Operator::create<Operator::NEXT>(); |
| template <> |
| Operator& Operator::create<Operator::ORIGIN>(); |
| template <> |
| Operator& Operator::create<Operator::SIZEOF>(); |
| |
| /* Binary operator */ |
| template <> |
| Operator& Operator::create<Operator::MUL>(); |
| template <> |
| Operator& Operator::create<Operator::DIV>(); |
| template <> |
| Operator& Operator::create<Operator::MOD>(); |
| template <> |
| Operator& Operator::create<Operator::ADD>(); |
| template <> |
| Operator& Operator::create<Operator::SUB>(); |
| template <> |
| Operator& Operator::create<Operator::LSHIFT>(); |
| template <> |
| Operator& Operator::create<Operator::RSHIFT>(); |
| template <> |
| Operator& Operator::create<Operator::LT>(); |
| template <> |
| Operator& Operator::create<Operator::LE>(); |
| template <> |
| Operator& Operator::create<Operator::GT>(); |
| template <> |
| Operator& Operator::create<Operator::GE>(); |
| template <> |
| Operator& Operator::create<Operator::EQ>(); |
| template <> |
| Operator& Operator::create<Operator::NE>(); |
| template <> |
| Operator& Operator::create<Operator::BITWISE_AND>(); |
| template <> |
| Operator& Operator::create<Operator::BITWISE_XOR>(); |
| template <> |
| Operator& Operator::create<Operator::BITWISE_OR>(); |
| template <> |
| Operator& Operator::create<Operator::LOGICAL_AND>(); |
| template <> |
| Operator& Operator::create<Operator::LOGICAL_OR>(); |
| |
| template <> |
| Operator& Operator::create<Operator::ALIGN>(); |
| template <> |
| Operator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>(); |
| template <> |
| Operator& Operator::create<Operator::MAX>(); |
| template <> |
| Operator& Operator::create<Operator::MIN>(); |
| template <> |
| Operator& Operator::create<Operator::SEGMENT_START>(); |
| |
| /* Ternary operator */ |
| template <> |
| Operator& Operator::create<Operator::TERNARY_IF>(); |
| |
| template <> |
| Operator& Operator::create<Operator::DATA_SEGMENT_ALIGN>(); |
| } // namespace mcld |
| |
| #endif // MCLD_SCRIPT_OPERATOR_H_ |