blob: 9258a32d4e66740fb9adb061d5e08f3c5440f9a9 [file] [log] [blame]
//===- Operand.h ----------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SCRIPT_OPERAND_H_
#define MCLD_SCRIPT_OPERAND_H_
#include "mcld/Config/Config.h"
#include "mcld/Object/SectionMap.h"
#include "mcld/Script/ExprToken.h"
#include "mcld/Support/Allocators.h"
#include <llvm/Support/DataTypes.h>
#include <string>
#include <cassert>
namespace mcld {
/** \class Operand
* \brief This class defines the interfaces to an operand token.
*/
class Operand : public ExprToken {
public:
enum Type { SYMBOL, INTEGER, SECTION, SECTION_DESC, FRAGMENT };
protected:
explicit Operand(Type pType);
virtual ~Operand();
public:
Type type() const { return m_Type; }
virtual bool isDot() const { return false; }
virtual uint64_t value() const = 0;
static bool classof(const ExprToken* pToken) {
return pToken->kind() == ExprToken::OPERAND;
}
private:
Type m_Type;
};
/** \class SymOperand
* \brief This class defines the interfaces to a symbol operand.
*/
class SymOperand : public Operand {
private:
friend class Chunk<SymOperand, MCLD_SYMBOLS_PER_INPUT>;
SymOperand();
explicit SymOperand(const std::string& pName);
public:
void dump() const;
const std::string& name() const { return m_Name; }
bool isDot() const;
uint64_t value() const { return m_Value; }
void setValue(uint64_t pValue) { m_Value = pValue; }
static bool classof(const Operand* pOperand) {
return pOperand->type() == Operand::SYMBOL;
}
/* factory method */
static SymOperand* create(const std::string& pName);
static void destroy(SymOperand*& pOperand);
static void clear();
private:
std::string m_Name;
uint64_t m_Value;
};
/** \class IntOperand
* \brief This class defines the interfaces to an integer operand.
*/
class IntOperand : public Operand {
private:
friend class Chunk<IntOperand, MCLD_SYMBOLS_PER_INPUT>;
IntOperand();
explicit IntOperand(uint64_t pValue);
public:
void dump() const;
uint64_t value() const { return m_Value; }
void setValue(uint64_t pValue) { m_Value = pValue; }
static bool classof(const Operand* pOperand) {
return pOperand->type() == Operand::INTEGER;
}
/* factory method */
static IntOperand* create(uint64_t pValue);
static void destroy(IntOperand*& pOperand);
static void clear();
private:
uint64_t m_Value;
};
/** \class SectOperand
* \brief This class defines the interfaces to an section name operand.
*/
class LDSection;
class SectOperand : public Operand {
private:
friend class Chunk<SectOperand, MCLD_SECTIONS_PER_INPUT>;
SectOperand();
explicit SectOperand(const std::string& pName);
public:
void dump() const;
const std::string& name() const { return m_Name; }
uint64_t value() const {
assert(0);
return 0;
}
static bool classof(const Operand* pOperand) {
return pOperand->type() == Operand::SECTION;
}
/* factory method */
static SectOperand* create(const std::string& pName);
static void destroy(SectOperand*& pOperand);
static void clear();
private:
std::string m_Name;
};
/** \class SectDescOperand
* \brief This class defines the interfaces to an section name operand.
*/
class SectDescOperand : public Operand {
private:
friend class Chunk<SectDescOperand, MCLD_SECTIONS_PER_INPUT>;
SectDescOperand();
explicit SectDescOperand(const SectionMap::Output* pOutputDesc);
public:
void dump() const;
const SectionMap::Output* outputDesc() const { return m_pOutputDesc; }
uint64_t value() const {
assert(0);
return 0;
}
static bool classof(const Operand* pOperand) {
return pOperand->type() == Operand::SECTION_DESC;
}
/* factory method */
static SectDescOperand* create(const SectionMap::Output* pOutputDesc);
static void destroy(SectDescOperand*& pOperand);
static void clear();
private:
const SectionMap::Output* m_pOutputDesc;
};
/** \class FragOperand
* \brief This class defines the interfaces to a fragment operand.
*/
class Fragment;
class FragOperand : public Operand {
private:
friend class Chunk<FragOperand, MCLD_SYMBOLS_PER_INPUT>;
FragOperand();
explicit FragOperand(Fragment& pFragment);
public:
void dump() const;
const Fragment* frag() const { return m_pFragment; }
Fragment* frag() { return m_pFragment; }
uint64_t value() const;
static bool classof(const Operand* pOperand) {
return pOperand->type() == Operand::FRAGMENT;
}
/* factory method */
static FragOperand* create(Fragment& pFragment);
static void destroy(FragOperand*& pOperand);
static void clear();
private:
Fragment* m_pFragment;
};
} // namespace mcld
#endif // MCLD_SCRIPT_OPERAND_H_