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