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