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