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