187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- BinaryOp.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_BINARYOP_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_BINARYOP_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Operator.h> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cstddef> 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 BinaryOP 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an binary operator token. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<Operator::Type TYPE> 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass BinaryOp : public Operator 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Operator; 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines BinaryOp() 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines : Operator(Operator::BINARY, TYPE), m_Size(0) 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pOperand[0] = m_pOperand[1] = NULL; 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~BinaryOp() 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines {} 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand* eval(const Module& pModule, const TargetLDBackend& pBackend); 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void appendOperand(Operand* pOperand) 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pOperand[m_Size++] = pOperand; 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_Size == 2) 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Size = 0; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t m_Size; 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Operand* m_pOperand[2]; 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 5887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MUL>::eval(const Module&, 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 6187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::DIV>::eval(const Module&, 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 6487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MOD>::eval(const Module&, 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 6787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ADD>::eval(const Module&, 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 7087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SUB>::eval(const Module&, 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 7387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LSHIFT>::eval(const Module&, 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 7687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::RSHIFT>::eval(const Module&, 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 7987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LT>::eval(const Module&, 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 8287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LE>::eval(const Module&, 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 8587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::GT>::eval(const Module&, 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 8887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::GE>::eval(const Module&, 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 9187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::EQ>::eval(const Module&, 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 9487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::NE>::eval(const Module&, 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 9787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_AND>::eval(const Module&, 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 10087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_XOR>::eval(const Module&, 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 10387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_OR>::eval(const Module&, 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 10687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_AND>::eval(const Module&, 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 10987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_OR>::eval(const Module&, 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 11387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ALIGN>::eval(const Module&, 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 11687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* 11787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesBinaryOp<Operator::DATA_SEGMENT_RELRO_END>::eval(const Module&, 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 12087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MAX>::eval(const Module&, 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 12387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MIN>::eval(const Module&, 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<> 12687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SEGMENT_START>::eval(const Module&, 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 133