C++程序  |  85行  |  1.79 KB

//===- Assignment.h -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SCRIPT_ASSIGNMENT_H
#define MCLD_SCRIPT_ASSIGNMENT_H

#include <mcld/Script/ScriptCommand.h>

namespace mcld
{

class Module;
class RpnExpr;
class SymOperand;
class RpnEvaluator;

/** \class Assignment
 *  \brief This class defines the interfaces to assignment command.
 */

class Assignment : public ScriptCommand
{
public:
  enum Level {
    OUTSIDE_SECTIONS, // outside SECTIONS command
    OUTPUT_SECTION,   // related to an output section
    INPUT_SECTION     // related to an input section
  };

  enum Type {
    DEFAULT,
    HIDDEN,
    PROVIDE,
    PROVIDE_HIDDEN
  };

public:
  Assignment(Level pLevel,
             Type pType,
             SymOperand& pSymbol,
             RpnExpr& pRpnExpr);

  ~Assignment();

  Assignment& operator=(const Assignment& pAssignment);

  Level level() const { return m_Level; }

  Type type() const { return m_Type; }

  const SymOperand& symbol() const { return m_Symbol; }
  SymOperand&       symbol()       { return m_Symbol; }

  const RpnExpr& getRpnExpr() const { return m_RpnExpr; }
  RpnExpr&       getRpnExpr()       { return m_RpnExpr; }

  void dump() const;

  static bool classof(const ScriptCommand* pCmd)
  {
    return pCmd->getKind() == ScriptCommand::ASSIGNMENT;
  }

  void activate(Module& pModule);

  /// assign - evaluate the rhs and assign the result to lhs.
  bool assign(RpnEvaluator& pEvaluator);

private:
  Level m_Level;
  Type m_Type;
  SymOperand& m_Symbol;
  RpnExpr& m_RpnExpr;
};

} // namespace of mcld

#endif