C++程序  |  312行  |  7.09 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/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