187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- Assignment.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_ASSIGNMENT_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_ASSIGNMENT_H
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/ScriptCommand.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass RpnExpr;
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass SymOperand;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass RpnEvaluator;
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class Assignment
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief This class defines the interfaces to assignment command.
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Assignment : public ScriptCommand
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Level {
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    OUTSIDE_SECTIONS, // outside SECTIONS command
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    OUTPUT_SECTION,   // related to an output section
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    INPUT_SECTION     // related to an input section
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Type {
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DEFAULT,
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    HIDDEN,
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    PROVIDE,
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    PROVIDE_HIDDEN
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Assignment(Level pLevel,
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             Type pType,
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             SymOperand& pSymbol,
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             RpnExpr& pRpnExpr);
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ~Assignment();
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Assignment& operator=(const Assignment& pAssignment);
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Level level() const { return m_Level; }
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type type() const { return m_Type; }
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const SymOperand& symbol() const { return m_Symbol; }
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  SymOperand&       symbol()       { return m_Symbol; }
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const RpnExpr& getRpnExpr() const { return m_RpnExpr; }
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr&       getRpnExpr()       { return m_RpnExpr; }
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void dump() const;
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static bool classof(const ScriptCommand* pCmd)
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return pCmd->getKind() == ScriptCommand::ASSIGNMENT;
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void activate(Module& pModule);
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// assign - evaluate the rhs and assign the result to lhs.
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool assign(RpnEvaluator& pEvaluator);
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Level m_Level;
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Type m_Type;
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  SymOperand& m_Symbol;
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr& m_RpnExpr;
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
85