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