187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- Operand.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_OPERAND_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SCRIPT_OPERAND_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/SectionMap.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ExprToken.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h" 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cassert> 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Operand 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an operand token. 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Operand : public ExprToken { 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum Type { SYMBOL, INTEGER, SECTION, SECTION_DESC, FRAGMENT }; 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines protected: 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Operand(Type pType); 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual ~Operand(); 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Type type() const { return m_Type; } 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool isDot() const { return false; } 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t value() const = 0; 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const ExprToken* pToken) { 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pToken->kind() == ExprToken::OPERAND; 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Type m_Type; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SymOperand 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to a symbol operand. 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SymOperand : public Operand { 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SymOperand, MCLD_SYMBOLS_PER_INPUT>; 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymOperand(); 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit SymOperand(const std::string& pName); 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDot() const; 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const { return m_Value; } 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setValue(uint64_t pValue) { m_Value = pValue; } 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Operand* pOperand) { 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SYMBOL; 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SymOperand* create(const std::string& pName); 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SymOperand*& pOperand); 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_Value; 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class IntOperand 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an integer operand. 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass IntOperand : public Operand { 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<IntOperand, MCLD_SYMBOLS_PER_INPUT>; 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand(); 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit IntOperand(uint64_t pValue); 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const { return m_Value; } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setValue(uint64_t pValue) { m_Value = pValue; } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Operand* pOperand) { 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::INTEGER; 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static IntOperand* create(uint64_t pValue); 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(IntOperand*& pOperand); 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_Value; 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SectOperand 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an section name operand. 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SectOperand : public Operand { 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SectOperand, MCLD_SECTIONS_PER_INPUT>; 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectOperand(); 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit SectOperand(const std::string& pName); 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t value() const { 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(0); 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return 0; 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Operand* pOperand) { 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SECTION; 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SectOperand* create(const std::string& pName); 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SectOperand*& pOperand); 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SectDescOperand 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an section name operand. 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SectDescOperand : public Operand { 15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SectDescOperand, MCLD_SECTIONS_PER_INPUT>; 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectDescOperand(); 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit SectDescOperand(const SectionMap::Output* pOutputDesc); 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const SectionMap::Output* outputDesc() const { return m_pOutputDesc; } 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t value() const { 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(0); 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return 0; 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Operand* pOperand) { 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SECTION_DESC; 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SectDescOperand* create(const SectionMap::Output* pOutputDesc); 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SectDescOperand*& pOperand); 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const SectionMap::Output* m_pOutputDesc; 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class FragOperand 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to a fragment operand. 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Fragment; 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass FragOperand : public Operand { 19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<FragOperand, MCLD_SYMBOLS_PER_INPUT>; 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FragOperand(); 19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit FragOperand(Fragment& pFragment); 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Fragment* frag() const { return m_pFragment; } 20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines Fragment* frag() { return m_pFragment; } 20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const; 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines static bool classof(const Operand* pOperand) { 20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::FRAGMENT; 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static FragOperand* create(Fragment& pFragment); 21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(FragOperand*& pOperand); 21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* m_pFragment; 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_SCRIPT_OPERAND_H_ 220