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