1//===- Module.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//
10// Module contains the intermediate representation (LDIR) of MCLinker.
11//
12//===----------------------------------------------------------------------===//
13#ifndef MCLD_MODULE_H
14#define MCLD_MODULE_H
15
16#include <mcld/InputTree.h>
17#include <mcld/LD/NamePool.h>
18#include <mcld/LD/SectionSymbolSet.h>
19#include <mcld/MC/SymbolCategory.h>
20
21#include <vector>
22#include <string>
23
24namespace mcld {
25
26class Input;
27class LinkerScript;
28class LDSection;
29class LDSymbol;
30
31/** \class Module
32 *  \brief Module provides the intermediate representation for linking.
33 */
34class Module
35{
36public:
37  typedef std::vector<Input*> ObjectList;
38  typedef ObjectList::iterator obj_iterator;
39  typedef ObjectList::const_iterator const_obj_iterator;
40
41  typedef std::vector<Input*> LibraryList;
42  typedef LibraryList::iterator lib_iterator;
43  typedef LibraryList::const_iterator const_lib_iterator;
44
45  typedef InputTree::iterator input_iterator;
46  typedef InputTree::const_iterator const_input_iterator;
47
48  typedef std::vector<LDSection*> SectionTable;
49  typedef SectionTable::iterator iterator;
50  typedef SectionTable::const_iterator const_iterator;
51
52  typedef SymbolCategory SymbolTable;
53  typedef SymbolTable::iterator sym_iterator;
54  typedef SymbolTable::const_iterator const_sym_iterator;
55
56  typedef std::vector<const ResolveInfo*> AliasList;
57  typedef AliasList::iterator alias_iterator;
58  typedef AliasList::const_iterator const_alias_iterator;
59
60public:
61  explicit Module(LinkerScript& pScript);
62
63  Module(const std::string& pName, LinkerScript& pScript);
64
65  ~Module();
66
67  const std::string& name() const { return m_Name; }
68
69  void setName(const std::string& pName) { m_Name = pName; }
70
71  const LinkerScript& getScript() const { return m_Script; }
72
73  LinkerScript&       getScript()       { return m_Script; }
74
75  // -----  link-in objects ----- //
76  const ObjectList& getObjectList() const { return m_ObjectList; }
77  ObjectList&       getObjectList()       { return m_ObjectList; }
78
79  const_obj_iterator obj_begin() const { return m_ObjectList.begin(); }
80  obj_iterator       obj_begin()       { return m_ObjectList.begin(); }
81  const_obj_iterator obj_end  () const { return m_ObjectList.end();   }
82  obj_iterator       obj_end  ()       { return m_ObjectList.end();   }
83
84  // -----  link-in libraries  ----- //
85  const LibraryList& getLibraryList() const { return m_LibraryList; }
86  LibraryList&       getLibraryList()       { return m_LibraryList; }
87
88  const_lib_iterator lib_begin() const { return m_LibraryList.begin(); }
89  lib_iterator       lib_begin()       { return m_LibraryList.begin(); }
90  const_lib_iterator lib_end  () const { return m_LibraryList.end();   }
91  lib_iterator       lib_end  ()       { return m_LibraryList.end();   }
92
93  // -----  link-in inputs  ----- //
94  const InputTree& getInputTree() const { return m_MainTree; }
95  InputTree&       getInputTree()       { return m_MainTree; }
96
97  const_input_iterator input_begin() const { return m_MainTree.begin(); }
98  input_iterator       input_begin()       { return m_MainTree.begin(); }
99  const_input_iterator input_end  () const { return m_MainTree.end();   }
100  input_iterator       input_end  ()       { return m_MainTree.end();   }
101
102/// @}
103/// @name Section Accessors
104/// @{
105
106  // -----  sections  ----- //
107  const SectionTable& getSectionTable() const { return m_SectionTable; }
108  SectionTable&       getSectionTable()       { return m_SectionTable; }
109
110  iterator         begin()       { return m_SectionTable.begin(); }
111  const_iterator   begin() const { return m_SectionTable.begin(); }
112  iterator         end  ()       { return m_SectionTable.end();   }
113  const_iterator   end  () const { return m_SectionTable.end();   }
114  LDSection*       front()       { return m_SectionTable.front(); }
115  const LDSection* front() const { return m_SectionTable.front(); }
116  LDSection*       back ()       { return m_SectionTable.back();  }
117  const LDSection* back () const { return m_SectionTable.back();  }
118  size_t           size () const { return m_SectionTable.size();  }
119  bool             empty() const { return m_SectionTable.empty(); }
120
121  LDSection*       getSection(const std::string& pName);
122  const LDSection* getSection(const std::string& pName) const;
123
124/// @}
125/// @name Symbol Accessors
126/// @{
127
128  // -----  symbols  ----- //
129  const SymbolTable& getSymbolTable() const { return m_SymbolTable; }
130  SymbolTable&       getSymbolTable()       { return m_SymbolTable; }
131
132  sym_iterator       sym_begin()       { return m_SymbolTable.begin();         }
133  const_sym_iterator sym_begin() const { return m_SymbolTable.begin();         }
134  sym_iterator       sym_end  ()       { return m_SymbolTable.end();           }
135  const_sym_iterator sym_end  () const { return m_SymbolTable.end();           }
136  size_t             sym_size () const { return m_SymbolTable.numOfSymbols();  }
137
138  // ----- section symbols ----- //
139  const LDSymbol* getSectionSymbol(const LDSection& pSection) const
140  { return m_SectSymbolSet.get(pSection); }
141
142  LDSymbol* getSectionSymbol(const LDSection& pSection)
143  { return m_SectSymbolSet.get(pSection); }
144
145  const SectionSymbolSet& getSectionSymbolSet() const
146  { return m_SectSymbolSet; }
147  SectionSymbolSet&       getSectionSymbolSet()
148  { return m_SectSymbolSet; }
149
150  // -----  names  ----- //
151  const NamePool& getNamePool() const { return m_NamePool; }
152  NamePool&       getNamePool()       { return m_NamePool; }
153
154  // -----  Aliases  ----- //
155  // create an alias list for pSym, the aliases of pSym
156  // can be added into the list by calling addAlias
157  void CreateAliasList(const ResolveInfo& pSym);
158
159  // add pAlias into the newly created alias list
160  void addAlias(const ResolveInfo& pAlias);
161  AliasList* getAliasList(const ResolveInfo& pSym);
162
163private:
164  std::string m_Name;
165  LinkerScript& m_Script;
166  ObjectList m_ObjectList;
167  LibraryList m_LibraryList;
168  InputTree m_MainTree;
169  SectionTable m_SectionTable;
170  SymbolTable m_SymbolTable;
171  NamePool m_NamePool;
172  SectionSymbolSet m_SectSymbolSet;
173  std::vector<AliasList*> m_AliasLists;
174};
175
176} // namespace of mcld
177
178#endif
179
180