C++程序  |  391行  |  6.56 KB

//===- 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/NullaryOp.h>
#include <mcld/Script/UnaryOp.h>
#include <mcld/Script/BinaryOp.h>
#include <mcld/Script/TernaryOp.h>
#include <mcld/Script/Operand.h>
#include <mcld/Support/raw_ostream.h>

using 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;
}