1//===- Assignment.h -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_SCRIPT_ASSIGNMENT_H_
10#define MCLD_SCRIPT_ASSIGNMENT_H_
11
12#include "mcld/Script/ScriptCommand.h"
13
14namespace mcld {
15
16class Module;
17class RpnEvaluator;
18class RpnExpr;
19class SymOperand;
20
21/** \class Assignment
22 *  \brief This class defines the interfaces to assignment command.
23 */
24
25class Assignment : public ScriptCommand {
26 public:
27  enum Level {
28    OUTSIDE_SECTIONS,  // outside SECTIONS command
29    OUTPUT_SECTION,    // related to an output section
30    INPUT_SECTION      // related to an input section
31  };
32
33  enum Type { DEFAULT, HIDDEN, PROVIDE, PROVIDE_HIDDEN };
34
35 public:
36  Assignment(Level pLevel, Type pType, SymOperand& pSymbol, RpnExpr& pRpnExpr);
37
38  ~Assignment();
39
40  Assignment& operator=(const Assignment& pAssignment);
41
42  Level level() const { return m_Level; }
43
44  Type type() const { return m_Type; }
45
46  const SymOperand& symbol() const { return m_Symbol; }
47  SymOperand& symbol() { return m_Symbol; }
48
49  const RpnExpr& getRpnExpr() const { return m_RpnExpr; }
50  RpnExpr& getRpnExpr() { return m_RpnExpr; }
51
52  void dump() const;
53
54  static bool classof(const ScriptCommand* pCmd) {
55    return pCmd->getKind() == ScriptCommand::ASSIGNMENT;
56  }
57
58  void activate(Module& pModule);
59
60  /// assign - evaluate the rhs and assign the result to lhs.
61  bool assign(RpnEvaluator& pEvaluator);
62
63 private:
64  Level m_Level;
65  Type m_Type;
66  SymOperand& m_Symbol;
67  RpnExpr& m_RpnExpr;
68};
69
70}  // namespace mcld
71
72#endif  // MCLD_SCRIPT_ASSIGNMENT_H_
73