blob: 017e735c808088200f7fd969ed88de3662fec5b4 [file] [log] [blame]
//===- Operator.h ---------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SCRIPT_OPERATOR_H_
#define MCLD_SCRIPT_OPERATOR_H_
#include "mcld/Script/ExprToken.h"
#include <llvm/Support/DataTypes.h>
namespace mcld {
class IntOperand;
class Module;
class Operand;
class TargetLDBackend;
/** \class Operator
* \brief This class defines the interfaces to an operator token.
*/
class Operator : public ExprToken {
public:
enum Arity { NULLARY, UNARY, BINARY, TERNARY };
enum Type {
/* arithmetic operator */
UNARY_PLUS = 0,
UNARY_MINUS = 1,
LOGICAL_NOT = 2,
BITWISE_NOT = 3,
MUL = 4,
DIV = 5,
MOD = 6,
ADD = 7,
SUB = 8,
LSHIFT = 9,
RSHIFT = 10,
LT = 11,
LE = 12,
GT = 13,
GE = 14,
EQ = 15,
NE = 16,
BITWISE_AND = 17,
BITWISE_XOR = 18,
BITWISE_OR = 19,
LOGICAL_AND = 20,
LOGICAL_OR = 21,
TERNARY_IF = 22,
ASSIGN = 23,
ADD_ASSIGN = 24,
SUB_ASSIGN = 25,
MUL_ASSIGN = 26,
DIV_ASSIGN = 27,
AND_ASSIGN = 28,
OR_ASSIGN = 29,
LS_ASSIGN = 30,
RS_ASSIGN = 31,
/* function */
ABSOLUTE = 32,
ADDR = 33,
ALIGN = 34,
ALIGNOF = 35,
BLOCK = 36,
DATA_SEGMENT_ALIGN = 37,
DATA_SEGMENT_END = 38,
DATA_SEGMENT_RELRO_END = 39,
DEFINED = 40,
LENGTH = 41,
LOADADDR = 42,
MAX = 43,
MIN = 44,
NEXT = 45,
ORIGIN = 46,
SEGMENT_START = 47,
SIZEOF = 48,
SIZEOF_HEADERS = 49,
MAXPAGESIZE = 50,
COMMONPAGESIZE = 51
};
static const char* OpNames[];
protected:
Operator(Arity pArity, Type pType);
const IntOperand* result() const { return m_pIntOperand; }
IntOperand* result() { return m_pIntOperand; }
public:
virtual ~Operator();
Arity arity() const { return m_Arity; }
Type type() const { return m_Type; }
virtual void dump() const;
virtual IntOperand* eval(const Module& pModule,
const TargetLDBackend& pBackend) = 0;
virtual void appendOperand(Operand* pOperand) = 0;
static bool classof(const ExprToken* pToken) {
return pToken->kind() == ExprToken::OPERATOR;
}
template <Operator::Type TYPE>
static Operator& create();
private:
Arity m_Arity;
Type m_Type;
IntOperand* m_pIntOperand;
};
/* Nullary operator */
template <>
Operator& Operator::create<Operator::SIZEOF_HEADERS>();
template <>
Operator& Operator::create<Operator::MAXPAGESIZE>();
template <>
Operator& Operator::create<Operator::COMMONPAGESIZE>();
/* Unary operator */
template <>
Operator& Operator::create<Operator::UNARY_PLUS>();
template <>
Operator& Operator::create<Operator::UNARY_MINUS>();
template <>
Operator& Operator::create<Operator::LOGICAL_NOT>();
template <>
Operator& Operator::create<Operator::BITWISE_NOT>();
template <>
Operator& Operator::create<Operator::ABSOLUTE>();
template <>
Operator& Operator::create<Operator::ADDR>();
template <>
Operator& Operator::create<Operator::ALIGNOF>();
template <>
Operator& Operator::create<Operator::DATA_SEGMENT_END>();
template <>
Operator& Operator::create<Operator::DEFINED>();
template <>
Operator& Operator::create<Operator::LENGTH>();
template <>
Operator& Operator::create<Operator::LOADADDR>();
template <>
Operator& Operator::create<Operator::NEXT>();
template <>
Operator& Operator::create<Operator::ORIGIN>();
template <>
Operator& Operator::create<Operator::SIZEOF>();
/* Binary operator */
template <>
Operator& Operator::create<Operator::MUL>();
template <>
Operator& Operator::create<Operator::DIV>();
template <>
Operator& Operator::create<Operator::MOD>();
template <>
Operator& Operator::create<Operator::ADD>();
template <>
Operator& Operator::create<Operator::SUB>();
template <>
Operator& Operator::create<Operator::LSHIFT>();
template <>
Operator& Operator::create<Operator::RSHIFT>();
template <>
Operator& Operator::create<Operator::LT>();
template <>
Operator& Operator::create<Operator::LE>();
template <>
Operator& Operator::create<Operator::GT>();
template <>
Operator& Operator::create<Operator::GE>();
template <>
Operator& Operator::create<Operator::EQ>();
template <>
Operator& Operator::create<Operator::NE>();
template <>
Operator& Operator::create<Operator::BITWISE_AND>();
template <>
Operator& Operator::create<Operator::BITWISE_XOR>();
template <>
Operator& Operator::create<Operator::BITWISE_OR>();
template <>
Operator& Operator::create<Operator::LOGICAL_AND>();
template <>
Operator& Operator::create<Operator::LOGICAL_OR>();
template <>
Operator& Operator::create<Operator::ALIGN>();
template <>
Operator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>();
template <>
Operator& Operator::create<Operator::MAX>();
template <>
Operator& Operator::create<Operator::MIN>();
template <>
Operator& Operator::create<Operator::SEGMENT_START>();
/* Ternary operator */
template <>
Operator& Operator::create<Operator::TERNARY_IF>();
template <>
Operator& Operator::create<Operator::DATA_SEGMENT_ALIGN>();
} // namespace mcld
#endif // MCLD_SCRIPT_OPERATOR_H_