187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- Operator.h ---------------------------------------------------------===//
287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//                     The MCLinker Project
487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source
687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details.
787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_SCRIPT_OPERATOR_INTERFACE_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_OPERATOR_INTERFACE_H
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/ExprToken.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Operand;
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IntOperand;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend;
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Operator
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief This class defines the interfaces to an operator token.
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Operator : public ExprToken
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Arity {
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    NULLARY,
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    UNARY,
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BINARY,
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    TERNARY
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Type {
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /* arithmetic operator */
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    UNARY_PLUS  = 0,
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    UNARY_MINUS = 1,
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOGICAL_NOT = 2,
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_NOT = 3,
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MUL         = 4,
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DIV         = 5,
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MOD         = 6,
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ADD         = 7,
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SUB         = 8,
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LSHIFT      = 9,
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RSHIFT      = 10,
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LT          = 11,
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LE          = 12,
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GT          = 13,
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GE          = 14,
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    EQ          = 15,
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    NE          = 16,
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_AND = 17,
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_XOR = 18,
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_OR  = 19,
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOGICAL_AND = 20,
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOGICAL_OR  = 21,
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    TERNARY_IF  = 22,
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ASSIGN      = 23,
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ADD_ASSIGN  = 24,
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SUB_ASSIGN  = 25,
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MUL_ASSIGN  = 26,
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DIV_ASSIGN  = 27,
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    AND_ASSIGN  = 28,
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    OR_ASSIGN   = 29,
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LS_ASSIGN   = 30,
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RS_ASSIGN   = 31,
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /* function */
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ABSOLUTE               = 32,
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ADDR                   = 33,
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ALIGN                  = 34,
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ALIGNOF                = 35,
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BLOCK                  = 36,
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DATA_SEGMENT_ALIGN     = 37,
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DATA_SEGMENT_END       = 38,
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DATA_SEGMENT_RELRO_END = 39,
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DEFINED                = 40,
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LENGTH                 = 41,
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOADADDR               = 42,
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MAX                    = 43,
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MIN                    = 44,
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    NEXT                   = 45,
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ORIGIN                 = 46,
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SEGMENT_START          = 47,
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SIZEOF                 = 48,
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    SIZEOF_HEADERS         = 49,
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    MAXPAGESIZE            = 50,
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    COMMONPAGESIZE         = 51
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static const char* OpNames[];
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprotected:
9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Operator(Arity pArity, Type pType);
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const IntOperand* result() const { return m_pIntOperand; }
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  IntOperand*       result()       { return m_pIntOperand; }
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual ~Operator();
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Arity arity() const { return m_Arity; }
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type type() const { return m_Type; }
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void dump() const;
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual IntOperand* eval(const Module& pModule,
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                           const TargetLDBackend& pBackend) = 0;
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void appendOperand(Operand* pOperand) = 0;
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static bool classof(const ExprToken* pToken)
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return pToken->kind() == ExprToken::OPERATOR;
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  template<Operator::Type TYPE>
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static Operator& create();
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Arity m_Arity;
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type m_Type;
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  IntOperand* m_pIntOperand;
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Nullary operator */
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
13287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SIZEOF_HEADERS>();
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
13487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MAXPAGESIZE>();
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
13687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::COMMONPAGESIZE>();
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Unary operator */
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
14087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::UNARY_PLUS>();
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
14287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::UNARY_MINUS>();
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
14487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_NOT>();
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
14687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_NOT>();
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
14987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ABSOLUTE>();
15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
15187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ADDR>();
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
15387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ALIGNOF>();
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
15587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_END>();
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
15787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DEFINED>();
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
15987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LENGTH>();
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
16187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOADADDR>();
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
16387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::NEXT>();
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
16587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ORIGIN>();
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
16787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SIZEOF>();
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Binary operator */
17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
17187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MUL>();
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
17387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DIV>();
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
17587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MOD>();
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
17787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ADD>();
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
17987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SUB>();
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
18187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LSHIFT>();
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
18387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::RSHIFT>();
18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
18587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LT>();
18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
18787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LE>();
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
18987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::GT>();
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
19187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::GE>();
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
19387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::EQ>();
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
19587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::NE>();
19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
19787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_AND>();
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
19987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_XOR>();
20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
20187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_OR>();
20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
20387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_AND>();
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
20587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_OR>();
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
20887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ALIGN>();
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
21087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>();
21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
21287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MAX>();
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
21487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MIN>();
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
21687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SEGMENT_START>();
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Ternary operator */
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
22087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::TERNARY_IF>();
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
22387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator&
22487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator::create<Operator::DATA_SEGMENT_ALIGN>();
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
229