//===- Operator.cpp -------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/Script/Operator.h" #include "mcld/Script/BinaryOp.h" #include "mcld/Script/NullaryOp.h" #include "mcld/Script/Operand.h" #include "mcld/Script/UnaryOp.h" #include "mcld/Script/TernaryOp.h" #include "mcld/Support/raw_ostream.h" namespace mcld { //===----------------------------------------------------------------------===// // Operator //===----------------------------------------------------------------------===// const char* Operator::OpNames[] = { "+", "-", "!", "~", "*", "/", "%", "+", "-", "<<", ">>", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||", "?:", "=", "+=", "-=", "*=", "/=", "&=", "|=", "<<=", ">>=", "ABSOLUTE", "ADDR", "ALIGN", "ALIGNOF", "BLOCK", "DATA_SEGMENT_ALIGN", "DATA_SEGMENT_END", "DATA_SEGMENT_RELRO_END", "DEFINED", "LENGTH", "LOADADDR", "MAX", "MIN", "NEXT", "ORIGIN", "SEGMENT_START", "SIZEOF", "SIZEOF_HEADERS", "MAXPAGESIZE", "COMMONPAGESIZE"}; Operator::Operator(Arity pArity, Type pType) : ExprToken(ExprToken::OPERATOR), m_Arity(pArity), m_Type(pType) { m_pIntOperand = IntOperand::create(0); } Operator::~Operator() { } void Operator::dump() const { mcld::outs() << OpNames[type()]; } /* Nullary operator */ template <> Operator& Operator::create<Operator::SIZEOF_HEADERS>() { static NullaryOp<Operator::SIZEOF_HEADERS> op; return op; } template <> Operator& Operator::create<Operator::MAXPAGESIZE>() { static NullaryOp<Operator::MAXPAGESIZE> op; return op; } template <> Operator& Operator::create<Operator::COMMONPAGESIZE>() { static NullaryOp<Operator::COMMONPAGESIZE> op; return op; } /* Unary operator */ template <> Operator& Operator::create<Operator::UNARY_PLUS>() { static UnaryOp<Operator::UNARY_PLUS> op; return op; } template <> Operator& Operator::create<Operator::UNARY_MINUS>() { static UnaryOp<Operator::UNARY_MINUS> op; return op; } template <> Operator& Operator::create<Operator::LOGICAL_NOT>() { static UnaryOp<Operator::LOGICAL_NOT> op; return op; } template <> Operator& Operator::create<Operator::BITWISE_NOT>() { static UnaryOp<Operator::BITWISE_NOT> op; return op; } template <> Operator& Operator::create<Operator::ABSOLUTE>() { static UnaryOp<Operator::ABSOLUTE> op; return op; } template <> Operator& Operator::create<Operator::ADDR>() { static UnaryOp<Operator::ADDR> op; return op; } template <> Operator& Operator::create<Operator::ALIGNOF>() { static UnaryOp<Operator::ALIGNOF> op; return op; } template <> Operator& Operator::create<Operator::DATA_SEGMENT_END>() { static UnaryOp<Operator::DATA_SEGMENT_END> op; return op; } template <> Operator& Operator::create<Operator::DEFINED>() { static UnaryOp<Operator::DEFINED> op; return op; } template <> Operator& Operator::create<Operator::LENGTH>() { static UnaryOp<Operator::LENGTH> op; return op; } template <> Operator& Operator::create<Operator::LOADADDR>() { static UnaryOp<Operator::LOADADDR> op; return op; } template <> Operator& Operator::create<Operator::NEXT>() { static UnaryOp<Operator::NEXT> op; return op; } template <> Operator& Operator::create<Operator::ORIGIN>() { static UnaryOp<Operator::ORIGIN> op; return op; } template <> Operator& Operator::create<Operator::SIZEOF>() { static UnaryOp<Operator::SIZEOF> op; return op; } /* Binary operator */ template <> Operator& Operator::create<Operator::MUL>() { static BinaryOp<Operator::MUL> op; return op; } template <> Operator& Operator::create<Operator::DIV>() { static BinaryOp<Operator::DIV> op; return op; } template <> Operator& Operator::create<Operator::MOD>() { static BinaryOp<Operator::MOD> op; return op; } template <> Operator& Operator::create<Operator::ADD>() { static BinaryOp<Operator::ADD> op; return op; } template <> Operator& Operator::create<Operator::SUB>() { static BinaryOp<Operator::SUB> op; return op; } template <> Operator& Operator::create<Operator::LSHIFT>() { static BinaryOp<Operator::LSHIFT> op; return op; } template <> Operator& Operator::create<Operator::RSHIFT>() { static BinaryOp<Operator::RSHIFT> op; return op; } template <> Operator& Operator::create<Operator::LT>() { static BinaryOp<Operator::LT> op; return op; } template <> Operator& Operator::create<Operator::LE>() { static BinaryOp<Operator::LE> op; return op; } template <> Operator& Operator::create<Operator::GT>() { static BinaryOp<Operator::GT> op; return op; } template <> Operator& Operator::create<Operator::GE>() { static BinaryOp<Operator::GE> op; return op; } template <> Operator& Operator::create<Operator::EQ>() { static BinaryOp<Operator::EQ> op; return op; } template <> Operator& Operator::create<Operator::NE>() { static BinaryOp<Operator::NE> op; return op; } template <> Operator& Operator::create<Operator::BITWISE_AND>() { static BinaryOp<Operator::BITWISE_AND> op; return op; } template <> Operator& Operator::create<Operator::BITWISE_XOR>() { static BinaryOp<Operator::BITWISE_XOR> op; return op; } template <> Operator& Operator::create<Operator::BITWISE_OR>() { static BinaryOp<Operator::BITWISE_OR> op; return op; } template <> Operator& Operator::create<Operator::LOGICAL_AND>() { static BinaryOp<Operator::LOGICAL_AND> op; return op; } template <> Operator& Operator::create<Operator::LOGICAL_OR>() { static BinaryOp<Operator::LOGICAL_OR> op; return op; } template <> Operator& Operator::create<Operator::ALIGN>() { static BinaryOp<Operator::ALIGN> op; return op; } template <> Operator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>() { static BinaryOp<Operator::DATA_SEGMENT_RELRO_END> op; return op; } template <> Operator& Operator::create<Operator::MAX>() { static BinaryOp<Operator::MAX> op; return op; } template <> Operator& Operator::create<Operator::MIN>() { static BinaryOp<Operator::MIN> op; return op; } template <> Operator& Operator::create<Operator::SEGMENT_START>() { static BinaryOp<Operator::SEGMENT_START> op; return op; } /* Ternary operator */ template <> Operator& Operator::create<Operator::TERNARY_IF>() { static TernaryOp<Operator::TERNARY_IF> op; return op; } template <> Operator& Operator::create<Operator::DATA_SEGMENT_ALIGN>() { static TernaryOp<Operator::DATA_SEGMENT_ALIGN> op; return op; } } // namespace mcld