Home | History | Annotate | Download | only in Script
      1 //===- Operator.cpp -------------------------------------------------------===//
      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 #include <mcld/Script/Operator.h>
     10 #include <mcld/Script/NullaryOp.h>
     11 #include <mcld/Script/UnaryOp.h>
     12 #include <mcld/Script/BinaryOp.h>
     13 #include <mcld/Script/TernaryOp.h>
     14 #include <mcld/Script/Operand.h>
     15 #include <mcld/Support/raw_ostream.h>
     16 
     17 using namespace mcld;
     18 //===----------------------------------------------------------------------===//
     19 // Operator
     20 //===----------------------------------------------------------------------===//
     21 const char* Operator::OpNames[] = {
     22   "+",
     23   "-",
     24   "!",
     25   "~",
     26   "*",
     27   "/",
     28   "%",
     29   "+",
     30   "-",
     31   "<<",
     32   ">>",
     33   "<",
     34   "<=",
     35   ">",
     36   ">=",
     37   "==",
     38   "!=",
     39   "&",
     40   "^",
     41   "|",
     42   "&&",
     43   "||",
     44   "?:",
     45   "=",
     46   "+=",
     47   "-=",
     48   "*=",
     49   "/=",
     50   "&=",
     51   "|=",
     52   "<<=",
     53   ">>=",
     54   "ABSOLUTE",
     55   "ADDR",
     56   "ALIGN",
     57   "ALIGNOF",
     58   "BLOCK",
     59   "DATA_SEGMENT_ALIGN",
     60   "DATA_SEGMENT_END",
     61   "DATA_SEGMENT_RELRO_END",
     62   "DEFINED",
     63   "LENGTH",
     64   "LOADADDR",
     65   "MAX",
     66   "MIN",
     67   "NEXT",
     68   "ORIGIN",
     69   "SEGMENT_START",
     70   "SIZEOF",
     71   "SIZEOF_HEADERS",
     72   "MAXPAGESIZE",
     73   "COMMONPAGESIZE"
     74 };
     75 
     76 Operator::Operator(Arity pArity,
     77                    Type pType)
     78   : ExprToken(ExprToken::OPERATOR),
     79     m_Arity(pArity),
     80     m_Type(pType)
     81 {
     82   m_pIntOperand = IntOperand::create(0);
     83 }
     84 
     85 Operator::~Operator()
     86 {
     87 }
     88 
     89 void Operator::dump() const
     90 {
     91   mcld::outs() << OpNames[type()];
     92 }
     93 
     94 /* Nullary operator */
     95 template<>
     96 Operator& Operator::create<Operator::SIZEOF_HEADERS>()
     97 {
     98   static NullaryOp<Operator::SIZEOF_HEADERS> op;
     99   return op;
    100 }
    101 
    102 template<>
    103 Operator& Operator::create<Operator::MAXPAGESIZE>()
    104 {
    105   static NullaryOp<Operator::MAXPAGESIZE> op;
    106   return op;
    107 }
    108 
    109 template<>
    110 Operator& Operator::create<Operator::COMMONPAGESIZE>()
    111 {
    112   static NullaryOp<Operator::COMMONPAGESIZE> op;
    113   return op;
    114 }
    115 
    116 /* Unary operator */
    117 template<>
    118 Operator& Operator::create<Operator::UNARY_PLUS>()
    119 {
    120   static UnaryOp<Operator::UNARY_PLUS> op;
    121   return op;
    122 }
    123 
    124 template<>
    125 Operator& Operator::create<Operator::UNARY_MINUS>()
    126 {
    127   static UnaryOp<Operator::UNARY_MINUS> op;
    128   return op;
    129 }
    130 
    131 template<>
    132 Operator& Operator::create<Operator::LOGICAL_NOT>()
    133 {
    134   static UnaryOp<Operator::LOGICAL_NOT> op;
    135   return op;
    136 }
    137 
    138 template<>
    139 Operator& Operator::create<Operator::BITWISE_NOT>()
    140 {
    141   static UnaryOp<Operator::BITWISE_NOT> op;
    142   return op;
    143 }
    144 
    145 template<>
    146 Operator& Operator::create<Operator::ABSOLUTE>()
    147 {
    148   static UnaryOp<Operator::ABSOLUTE> op;
    149   return op;
    150 }
    151 
    152 template<>
    153 Operator& Operator::create<Operator::ADDR>()
    154 {
    155   static UnaryOp<Operator::ADDR> op;
    156   return op;
    157 }
    158 
    159 template<>
    160 Operator& Operator::create<Operator::ALIGNOF>()
    161 {
    162   static UnaryOp<Operator::ALIGNOF> op;
    163   return op;
    164 }
    165 
    166 template<>
    167 Operator& Operator::create<Operator::DATA_SEGMENT_END>()
    168 {
    169   static UnaryOp<Operator::DATA_SEGMENT_END> op;
    170   return op;
    171 }
    172 
    173 template<>
    174 Operator& Operator::create<Operator::DEFINED>()
    175 {
    176   static UnaryOp<Operator::DEFINED> op;
    177   return op;
    178 }
    179 
    180 template<>
    181 Operator& Operator::create<Operator::LENGTH>()
    182 {
    183   static UnaryOp<Operator::LENGTH> op;
    184   return op;
    185 }
    186 
    187 template<>
    188 Operator& Operator::create<Operator::LOADADDR>()
    189 {
    190   static UnaryOp<Operator::LOADADDR> op;
    191   return op;
    192 }
    193 
    194 template<>
    195 Operator& Operator::create<Operator::NEXT>()
    196 {
    197   static UnaryOp<Operator::NEXT> op;
    198   return op;
    199 }
    200 
    201 template<>
    202 Operator& Operator::create<Operator::ORIGIN>()
    203 {
    204   static UnaryOp<Operator::ORIGIN> op;
    205   return op;
    206 }
    207 
    208 template<>
    209 Operator& Operator::create<Operator::SIZEOF>()
    210 {
    211   static UnaryOp<Operator::SIZEOF> op;
    212   return op;
    213 }
    214 
    215 /* Binary operator */
    216 template<>
    217 Operator& Operator::create<Operator::MUL>()
    218 {
    219   static BinaryOp<Operator::MUL> op;
    220   return op;
    221 }
    222 
    223 template<>
    224 Operator& Operator::create<Operator::DIV>()
    225 {
    226   static BinaryOp<Operator::DIV> op;
    227   return op;
    228 }
    229 
    230 template<>
    231 Operator& Operator::create<Operator::MOD>()
    232 {
    233   static BinaryOp<Operator::MOD> op;
    234   return op;
    235 }
    236 
    237 template<>
    238 Operator& Operator::create<Operator::ADD>()
    239 {
    240   static BinaryOp<Operator::ADD> op;
    241   return op;
    242 }
    243 
    244 template<>
    245 Operator& Operator::create<Operator::SUB>()
    246 {
    247   static BinaryOp<Operator::SUB> op;
    248   return op;
    249 }
    250 
    251 template<>
    252 Operator& Operator::create<Operator::LSHIFT>()
    253 {
    254   static BinaryOp<Operator::LSHIFT> op;
    255   return op;
    256 }
    257 
    258 template<>
    259 Operator& Operator::create<Operator::RSHIFT>()
    260 {
    261   static BinaryOp<Operator::RSHIFT> op;
    262   return op;
    263 }
    264 
    265 template<>
    266 Operator& Operator::create<Operator::LT>()
    267 {
    268   static BinaryOp<Operator::LT> op;
    269   return op;
    270 }
    271 
    272 template<>
    273 Operator& Operator::create<Operator::LE>()
    274 {
    275   static BinaryOp<Operator::LE> op;
    276   return op;
    277 }
    278 
    279 template<>
    280 Operator& Operator::create<Operator::GT>()
    281 {
    282   static BinaryOp<Operator::GT> op;
    283   return op;
    284 }
    285 
    286 template<>
    287 Operator& Operator::create<Operator::GE>()
    288 {
    289   static BinaryOp<Operator::GE> op;
    290   return op;
    291 }
    292 
    293 template<>
    294 Operator& Operator::create<Operator::EQ>()
    295 {
    296   static BinaryOp<Operator::EQ> op;
    297   return op;
    298 }
    299 
    300 template<>
    301 Operator& Operator::create<Operator::NE>()
    302 {
    303   static BinaryOp<Operator::NE> op;
    304   return op;
    305 }
    306 
    307 template<>
    308 Operator& Operator::create<Operator::BITWISE_AND>()
    309 {
    310   static BinaryOp<Operator::BITWISE_AND> op;
    311   return op;
    312 }
    313 
    314 template<>
    315 Operator& Operator::create<Operator::BITWISE_XOR>()
    316 {
    317   static BinaryOp<Operator::BITWISE_XOR> op;
    318   return op;
    319 }
    320 
    321 template<>
    322 Operator& Operator::create<Operator::BITWISE_OR>()
    323 {
    324   static BinaryOp<Operator::BITWISE_OR> op;
    325   return op;
    326 }
    327 
    328 template<>
    329 Operator& Operator::create<Operator::LOGICAL_AND>()
    330 {
    331   static BinaryOp<Operator::LOGICAL_AND> op;
    332   return op;
    333 }
    334 
    335 template<>
    336 Operator& Operator::create<Operator::LOGICAL_OR>()
    337 {
    338   static BinaryOp<Operator::LOGICAL_OR> op;
    339   return op;
    340 }
    341 
    342 template<>
    343 Operator& Operator::create<Operator::ALIGN>()
    344 {
    345   static BinaryOp<Operator::ALIGN> op;
    346   return op;
    347 }
    348 
    349 template<>
    350 Operator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>()
    351 {
    352   static BinaryOp<Operator::DATA_SEGMENT_RELRO_END> op;
    353   return op;
    354 }
    355 
    356 template<>
    357 Operator& Operator::create<Operator::MAX>()
    358 {
    359   static BinaryOp<Operator::MAX> op;
    360   return op;
    361 }
    362 
    363 template<>
    364 Operator& Operator::create<Operator::MIN>()
    365 {
    366   static BinaryOp<Operator::MIN> op;
    367   return op;
    368 }
    369 
    370 template<>
    371 Operator& Operator::create<Operator::SEGMENT_START>()
    372 {
    373   static BinaryOp<Operator::SEGMENT_START> op;
    374   return op;
    375 }
    376 
    377 /* Ternary operator */
    378 template<>
    379 Operator& Operator::create<Operator::TERNARY_IF>()
    380 {
    381   static TernaryOp<Operator::TERNARY_IF> op;
    382   return op;
    383 }
    384 
    385 template<>
    386 Operator& Operator::create<Operator::DATA_SEGMENT_ALIGN>()
    387 {
    388   static TernaryOp<Operator::DATA_SEGMENT_ALIGN> op;
    389   return op;
    390 }
    391