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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SCRIPT_OPERATOR_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SCRIPT_OPERATOR_H_
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ExprToken.h"
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IntOperand;
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Operand;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend;
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Operator
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief This class defines the interfaces to an operator token.
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Operator : public ExprToken {
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  enum Arity { NULLARY, UNARY, BINARY, TERNARY };
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Type {
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /* arithmetic operator */
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    UNARY_PLUS = 0,
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    UNARY_MINUS = 1,
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOGICAL_NOT = 2,
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_NOT = 3,
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MUL = 4,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DIV = 5,
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MOD = 6,
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ADD = 7,
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SUB = 8,
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LSHIFT = 9,
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    RSHIFT = 10,
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LT = 11,
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LE = 12,
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    GT = 13,
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    GE = 14,
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    EQ = 15,
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    NE = 16,
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_AND = 17,
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BITWISE_XOR = 18,
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    BITWISE_OR = 19,
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LOGICAL_AND = 20,
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LOGICAL_OR = 21,
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    TERNARY_IF = 22,
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSIGN = 23,
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ADD_ASSIGN = 24,
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SUB_ASSIGN = 25,
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MUL_ASSIGN = 26,
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DIV_ASSIGN = 27,
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    AND_ASSIGN = 28,
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    OR_ASSIGN = 29,
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LS_ASSIGN = 30,
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    RS_ASSIGN = 31,
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    /* function */
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ABSOLUTE = 32,
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ADDR = 33,
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ALIGN = 34,
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ALIGNOF = 35,
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    BLOCK = 36,
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DATA_SEGMENT_ALIGN = 37,
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DATA_SEGMENT_END = 38,
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DATA_SEGMENT_RELRO_END = 39,
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DEFINED = 40,
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LENGTH = 41,
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LOADADDR = 42,
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MAX = 43,
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MIN = 44,
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    NEXT = 45,
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ORIGIN = 46,
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SEGMENT_START = 47,
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SIZEOF = 48,
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SIZEOF_HEADERS = 49,
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MAXPAGESIZE = 50,
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    COMMONPAGESIZE = 51
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static const char* OpNames[];
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected:
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Operator(Arity pArity, Type pType);
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const IntOperand* result() const { return m_pIntOperand; }
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  IntOperand* result() { return m_pIntOperand; }
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual ~Operator();
9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Arity arity() const { return m_Arity; }
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type type() const { return m_Type; }
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void dump() const;
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual IntOperand* eval(const Module& pModule,
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                           const TargetLDBackend& pBackend) = 0;
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual void appendOperand(Operand* pOperand) = 0;
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static bool classof(const ExprToken* pToken) {
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return pToken->kind() == ExprToken::OPERATOR;
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  template <Operator::Type TYPE>
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static Operator& create();
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Arity m_Arity;
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type m_Type;
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  IntOperand* m_pIntOperand;
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Nullary operator */
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
12487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SIZEOF_HEADERS>();
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
12687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MAXPAGESIZE>();
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
12887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::COMMONPAGESIZE>();
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Unary operator */
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::UNARY_PLUS>();
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::UNARY_MINUS>();
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_NOT>();
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_NOT>();
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ABSOLUTE>();
14237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ADDR>();
14437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ALIGNOF>();
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_END>();
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DEFINED>();
15037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LENGTH>();
15237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOADADDR>();
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::NEXT>();
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ORIGIN>();
15837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SIZEOF>();
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Binary operator */
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MUL>();
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DIV>();
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MOD>();
16837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ADD>();
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SUB>();
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LSHIFT>();
17437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::RSHIFT>();
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LT>();
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LE>();
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::GT>();
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::GE>();
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::EQ>();
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::NE>();
18837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_AND>();
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_XOR>();
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::BITWISE_OR>();
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_AND>();
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::LOGICAL_OR>();
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
19937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::ALIGN>();
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>();
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MAX>();
20537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::MIN>();
20737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::SEGMENT_START>();
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Ternary operator */
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
21287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesOperator& Operator::create<Operator::TERNARY_IF>();
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
21537b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_ALIGN>();
21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_SCRIPT_OPERATOR_H_
219