Home | History | Annotate | Download | only in Script
      1 //===- Operator.h ---------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_SCRIPT_OPERATOR_H_
     10 #define MCLD_SCRIPT_OPERATOR_H_
     11 
     12 #include "mcld/Script/ExprToken.h"
     13 #include <llvm/Support/DataTypes.h>
     14 
     15 namespace mcld {
     16 
     17 class IntOperand;
     18 class Module;
     19 class Operand;
     20 class TargetLDBackend;
     21 
     22 /** \class Operator
     23  *  \brief This class defines the interfaces to an operator token.
     24  */
     25 
     26 class Operator : public ExprToken {
     27  public:
     28   enum Arity { NULLARY, UNARY, BINARY, TERNARY };
     29 
     30   enum Type {
     31     /* arithmetic operator */
     32     UNARY_PLUS = 0,
     33     UNARY_MINUS = 1,
     34     LOGICAL_NOT = 2,
     35     BITWISE_NOT = 3,
     36     MUL = 4,
     37     DIV = 5,
     38     MOD = 6,
     39     ADD = 7,
     40     SUB = 8,
     41     LSHIFT = 9,
     42     RSHIFT = 10,
     43     LT = 11,
     44     LE = 12,
     45     GT = 13,
     46     GE = 14,
     47     EQ = 15,
     48     NE = 16,
     49     BITWISE_AND = 17,
     50     BITWISE_XOR = 18,
     51     BITWISE_OR = 19,
     52     LOGICAL_AND = 20,
     53     LOGICAL_OR = 21,
     54     TERNARY_IF = 22,
     55     ASSIGN = 23,
     56     ADD_ASSIGN = 24,
     57     SUB_ASSIGN = 25,
     58     MUL_ASSIGN = 26,
     59     DIV_ASSIGN = 27,
     60     AND_ASSIGN = 28,
     61     OR_ASSIGN = 29,
     62     LS_ASSIGN = 30,
     63     RS_ASSIGN = 31,
     64     /* function */
     65     ABSOLUTE = 32,
     66     ADDR = 33,
     67     ALIGN = 34,
     68     ALIGNOF = 35,
     69     BLOCK = 36,
     70     DATA_SEGMENT_ALIGN = 37,
     71     DATA_SEGMENT_END = 38,
     72     DATA_SEGMENT_RELRO_END = 39,
     73     DEFINED = 40,
     74     LENGTH = 41,
     75     LOADADDR = 42,
     76     MAX = 43,
     77     MIN = 44,
     78     NEXT = 45,
     79     ORIGIN = 46,
     80     SEGMENT_START = 47,
     81     SIZEOF = 48,
     82     SIZEOF_HEADERS = 49,
     83     MAXPAGESIZE = 50,
     84     COMMONPAGESIZE = 51
     85   };
     86 
     87   static const char* OpNames[];
     88 
     89  protected:
     90   Operator(Arity pArity, Type pType);
     91 
     92   const IntOperand* result() const { return m_pIntOperand; }
     93   IntOperand* result() { return m_pIntOperand; }
     94 
     95  public:
     96   virtual ~Operator();
     97 
     98   Arity arity() const { return m_Arity; }
     99 
    100   Type type() const { return m_Type; }
    101 
    102   virtual void dump() const;
    103 
    104   virtual IntOperand* eval(const Module& pModule,
    105                            const TargetLDBackend& pBackend) = 0;
    106 
    107   virtual void appendOperand(Operand* pOperand) = 0;
    108 
    109   static bool classof(const ExprToken* pToken) {
    110     return pToken->kind() == ExprToken::OPERATOR;
    111   }
    112 
    113   template <Operator::Type TYPE>
    114   static Operator& create();
    115 
    116  private:
    117   Arity m_Arity;
    118   Type m_Type;
    119   IntOperand* m_pIntOperand;
    120 };
    121 
    122 /* Nullary operator */
    123 template <>
    124 Operator& Operator::create<Operator::SIZEOF_HEADERS>();
    125 template <>
    126 Operator& Operator::create<Operator::MAXPAGESIZE>();
    127 template <>
    128 Operator& Operator::create<Operator::COMMONPAGESIZE>();
    129 
    130 /* Unary operator */
    131 template <>
    132 Operator& Operator::create<Operator::UNARY_PLUS>();
    133 template <>
    134 Operator& Operator::create<Operator::UNARY_MINUS>();
    135 template <>
    136 Operator& Operator::create<Operator::LOGICAL_NOT>();
    137 template <>
    138 Operator& Operator::create<Operator::BITWISE_NOT>();
    139 
    140 template <>
    141 Operator& Operator::create<Operator::ABSOLUTE>();
    142 template <>
    143 Operator& Operator::create<Operator::ADDR>();
    144 template <>
    145 Operator& Operator::create<Operator::ALIGNOF>();
    146 template <>
    147 Operator& Operator::create<Operator::DATA_SEGMENT_END>();
    148 template <>
    149 Operator& Operator::create<Operator::DEFINED>();
    150 template <>
    151 Operator& Operator::create<Operator::LENGTH>();
    152 template <>
    153 Operator& Operator::create<Operator::LOADADDR>();
    154 template <>
    155 Operator& Operator::create<Operator::NEXT>();
    156 template <>
    157 Operator& Operator::create<Operator::ORIGIN>();
    158 template <>
    159 Operator& Operator::create<Operator::SIZEOF>();
    160 
    161 /* Binary operator */
    162 template <>
    163 Operator& Operator::create<Operator::MUL>();
    164 template <>
    165 Operator& Operator::create<Operator::DIV>();
    166 template <>
    167 Operator& Operator::create<Operator::MOD>();
    168 template <>
    169 Operator& Operator::create<Operator::ADD>();
    170 template <>
    171 Operator& Operator::create<Operator::SUB>();
    172 template <>
    173 Operator& Operator::create<Operator::LSHIFT>();
    174 template <>
    175 Operator& Operator::create<Operator::RSHIFT>();
    176 template <>
    177 Operator& Operator::create<Operator::LT>();
    178 template <>
    179 Operator& Operator::create<Operator::LE>();
    180 template <>
    181 Operator& Operator::create<Operator::GT>();
    182 template <>
    183 Operator& Operator::create<Operator::GE>();
    184 template <>
    185 Operator& Operator::create<Operator::EQ>();
    186 template <>
    187 Operator& Operator::create<Operator::NE>();
    188 template <>
    189 Operator& Operator::create<Operator::BITWISE_AND>();
    190 template <>
    191 Operator& Operator::create<Operator::BITWISE_XOR>();
    192 template <>
    193 Operator& Operator::create<Operator::BITWISE_OR>();
    194 template <>
    195 Operator& Operator::create<Operator::LOGICAL_AND>();
    196 template <>
    197 Operator& Operator::create<Operator::LOGICAL_OR>();
    198 
    199 template <>
    200 Operator& Operator::create<Operator::ALIGN>();
    201 template <>
    202 Operator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>();
    203 template <>
    204 Operator& Operator::create<Operator::MAX>();
    205 template <>
    206 Operator& Operator::create<Operator::MIN>();
    207 template <>
    208 Operator& Operator::create<Operator::SEGMENT_START>();
    209 
    210 /* Ternary operator */
    211 template <>
    212 Operator& Operator::create<Operator::TERNARY_IF>();
    213 
    214 template <>
    215 Operator& Operator::create<Operator::DATA_SEGMENT_ALIGN>();
    216 }  // namespace mcld
    217 
    218 #endif  // MCLD_SCRIPT_OPERATOR_H_
    219