187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- UnaryOp.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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SCRIPT_UNARYOP_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SCRIPT_UNARYOP_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operator.h" 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cstddef> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IntOperand; 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Operand; 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend; 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class UnaryOp 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an unary operator token. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <Operator::Type TYPE> 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass UnaryOp : public Operator { 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Operator; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines UnaryOp() : Operator(Operator::UNARY, TYPE), m_pOperand(NULL) {} 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ~UnaryOp() {} 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand* eval(const Module& pModule, const TargetLDBackend& pBackend); 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines void appendOperand(Operand* pOperand) { m_pOperand = pOperand; } 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Operand* m_pOperand; 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 4687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::UNARY_PLUS>::eval(const Module&, 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 4987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::UNARY_MINUS>::eval(const Module&, 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::LOGICAL_NOT>::eval(const Module&, 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::BITWISE_NOT>::eval(const Module&, 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::ABSOLUTE>::eval(const Module&, 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::ADDR>::eval(const Module&, 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::ALIGNOF>::eval(const Module&, 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::DATA_SEGMENT_END>::eval(const Module&, 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::DEFINED>::eval(const Module&, 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::LENGTH>::eval(const Module&, 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::LOADADDR>::eval(const Module&, 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::NEXT>::eval(const Module&, 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::ORIGIN>::eval(const Module&, 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* UnaryOp<Operator::SIZEOF>::eval(const Module&, 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_SCRIPT_UNARYOP_H_ 92