You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
4.8 KiB
220 lines
4.8 KiB
//===- 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_
|