1//===- ScriptFile.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_SCRIPTFILE_H
10#define MCLD_SCRIPT_SCRIPTFILE_H
11
12#include <mcld/Script/Assignment.h>
13#include <mcld/Script/OutputSectDesc.h>
14#include <mcld/Script/InputSectDesc.h>
15#include <vector>
16#include <string>
17
18namespace mcld
19{
20
21class ScriptCommand;
22class Input;
23class InputTree;
24class InputBuilder;
25class GroupReader;
26class LinkerConfig;
27class RpnExpr;
28class StringList;
29class Module;
30
31/** \class ScriptFile
32 *  \brief This class defines the interfaces to a linker script file.
33 */
34
35class ScriptFile
36{
37public:
38  enum Kind {
39    LDScript,      // -T
40    Expression,    // --defsym
41    VersionScript, // --version-script
42    DynamicList,   // --dynamic-list
43    Unknown
44  };
45
46  typedef std::vector<ScriptCommand*> CommandQueue;
47  typedef CommandQueue::const_iterator const_iterator;
48  typedef CommandQueue::iterator iterator;
49  typedef CommandQueue::const_reference const_reference;
50  typedef CommandQueue::reference reference;
51
52public:
53  ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder);
54  ~ScriptFile();
55
56  const_iterator  begin() const { return m_CommandQueue.begin(); }
57  iterator        begin()       { return m_CommandQueue.begin(); }
58  const_iterator  end()   const { return m_CommandQueue.end(); }
59  iterator        end()         { return m_CommandQueue.end(); }
60
61  const_reference front() const { return m_CommandQueue.front(); }
62  reference       front()       { return m_CommandQueue.front(); }
63  const_reference back()  const { return m_CommandQueue.back(); }
64  reference       back()        { return m_CommandQueue.back(); }
65
66  const Input& input() const { return m_Input; }
67  Input&       input()       { return m_Input; }
68
69  size_t size() const { return m_CommandQueue.size(); }
70
71  Kind getKind() const { return m_Kind; }
72
73  const InputTree& inputs() const { return *m_pInputTree; }
74  InputTree&       inputs()       { return *m_pInputTree; }
75
76  const std::string& name() const { return m_Name; }
77  std::string&       name()       { return m_Name; }
78
79  void dump() const;
80  void activate(Module& pModule);
81
82  /// ENTRY(symbol)
83  void addEntryPoint(const std::string& pSymbol);
84
85  /// OUTPUT_FORMAT(bfdname)
86  /// OUTPUT_FORMAT(default, big, little)
87  void addOutputFormatCmd(const std::string& pFormat);
88  void addOutputFormatCmd(const std::string& pDefault,
89                          const std::string& pBig,
90                          const std::string& pLittle);
91
92  /// GROUP(file, file, ...)
93  /// GROUP(file file ...)
94  void addGroupCmd(StringList& pStringList,
95                   GroupReader& pGroupReader,
96                   const LinkerConfig& pConfig);
97
98  /// OUTPUT(filename)
99  void addOutputCmd(const std::string& pFileName);
100
101  /// SEARCH_DIR(path)
102  void addSearchDirCmd(const std::string& pPath);
103
104  /// OUTPUT_ARCH(bfdarch)
105  void addOutputArchCmd(const std::string& pArch);
106
107  /// ASSERT(exp, message)
108  void addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage);
109
110  /// assignment
111  void addAssignment(const std::string& pSymbol,
112                     RpnExpr& pRpnExpr,
113                     Assignment::Type pType = Assignment::DEFAULT);
114
115  bool hasSectionsCmd() const;
116
117  void enterSectionsCmd();
118
119  void leaveSectionsCmd();
120
121  void enterOutputSectDesc(const std::string& pName,
122                           const OutputSectDesc::Prolog& pProlog);
123
124  void leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog);
125
126  void addInputSectDesc(InputSectDesc::KeepPolicy pPolicy,
127                        const InputSectDesc::Spec& pSpec);
128
129  RpnExpr* createRpnExpr();
130  const RpnExpr* getCurrentRpnExpr() const { return m_pRpnExpr; }
131  RpnExpr*       getCurrentRpnExpr()       { return m_pRpnExpr; }
132
133  StringList* createStringList();
134  const StringList* getCurrentStringList() const { return m_pStringList; }
135  StringList*       getCurrentStringList()       { return m_pStringList; }
136
137  void setAsNeeded(bool pEnable = true);
138  bool asNeeded() const { return m_bAsNeeded; }
139
140  static const std::string& createParserStr(const char* pText, size_t pLength);
141
142  static void clearParserStrPool();
143
144private:
145  Kind m_Kind;
146  Input& m_Input;
147  std::string m_Name;
148  InputTree* m_pInputTree;
149  InputBuilder& m_Builder;
150  CommandQueue m_CommandQueue;
151  bool m_bHasSectionsCmd;
152  bool m_bInSectionsCmd;
153  bool m_bInOutputSectDesc;
154  RpnExpr* m_pRpnExpr;
155  StringList* m_pStringList;
156  bool m_bAsNeeded;
157};
158
159} // namespace of mcld
160
161#endif
162
163