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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_SCRIPT_OPERAND_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_OPERAND_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/ExprToken.h> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Object/SectionMap.h> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Support/Allocators.h> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Config/Config.h> 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cassert> 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Operand 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an operand token. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Operand : public ExprToken 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum Type { 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SYMBOL, 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines INTEGER, 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SECTION, 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SECTION_DESC, 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FRAGMENT 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprotected: 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Operand(Type pType); 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual ~Operand(); 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Type type() const { return m_Type; } 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool isDot() const { return false; } 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual uint64_t value() const = 0; 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const ExprToken* pToken) 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pToken->kind() == ExprToken::OPERAND; 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Type m_Type; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SymOperand 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to a symbol operand. 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass SymOperand : public Operand 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SymOperand, MCLD_SYMBOLS_PER_INPUT>; 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymOperand(); 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymOperand(const std::string& pName); 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDot() const; 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const { return m_Value; } 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setValue(uint64_t pValue) { m_Value = pValue; } 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const Operand* pOperand) 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SYMBOL; 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SymOperand* create(const std::string& pName); 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SymOperand*& pOperand); 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_Value; 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class IntOperand 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an integer operand. 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IntOperand : public Operand 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<IntOperand, MCLD_SYMBOLS_PER_INPUT>; 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand(); 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand(uint64_t pValue); 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const { return m_Value; } 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setValue(uint64_t pValue) { m_Value = pValue; } 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const Operand* pOperand) 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::INTEGER; 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static IntOperand* create(uint64_t pValue); 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(IntOperand*& pOperand); 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_Value; 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SectOperand 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an section name operand. 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass SectOperand : public Operand 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SectOperand, MCLD_SECTIONS_PER_INPUT>; 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectOperand(); 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectOperand(const std::string& pName); 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(0); 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return 0; 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const Operand* pOperand) 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SECTION; 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SectOperand* create(const std::string& pName); 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SectOperand*& pOperand); 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class SectDescOperand 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to an section name operand. 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass SectDescOperand : public Operand 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<SectDescOperand, MCLD_SECTIONS_PER_INPUT>; 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectDescOperand(); 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectDescOperand(const SectionMap::Output* pOutputDesc); 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const SectionMap::Output* outputDesc() const { return m_pOutputDesc; } 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(0); 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return 0; 18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const Operand* pOperand) 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::SECTION_DESC; 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static SectDescOperand* create(const SectionMap::Output* pOutputDesc); 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(SectDescOperand*& pOperand); 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const SectionMap::Output* m_pOutputDesc; 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class FragOperand 20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to a fragment operand. 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Fragment; 20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FragOperand : public Operand 20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Chunk<FragOperand, MCLD_SYMBOLS_PER_INPUT>; 21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FragOperand(); 21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FragOperand(Fragment& pFragment); 21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Fragment* frag() const { return m_pFragment; } 21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* frag() { return m_pFragment; } 21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t value() const; 22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static bool classof(const Operand* pOperand) 22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return pOperand->type() == Operand::FRAGMENT; 22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /* factory method */ 22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static FragOperand* create(Fragment& pFragment); 22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void destroy(FragOperand*& pOperand); 22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clear(); 23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Fragment* m_pFragment; 23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld 23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 23887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 239