blob: 9ea9812f857040b948103c90a1fda9c6cc8ec3a5 [file] [log] [blame]
Shih-wei Liao22add6f2012-12-15 17:21:00 -08001//===- 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>
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070021#include <map>
Shih-wei Liao22add6f2012-12-15 17:21:00 -080022
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070023#include <mcld/LinkerScript.h>
Shih-wei Liao22add6f2012-12-15 17:21:00 -080024#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
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070034#include <llvm/ADT/ilist.h>
35
Shih-wei Liao22add6f2012-12-15 17:21:00 -080036namespace 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
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070066 typedef std::vector<const ResolveInfo*> AliasList;
67 typedef AliasList::iterator alias_iterator;
68 typedef AliasList::const_iterator const_alias_iterator;
Shih-wei Liao22add6f2012-12-15 17:21:00 -080069
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070070public:
71 explicit Module(LinkerScript& pScript);
72
73 Module(const std::string& pName, LinkerScript& pScript);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080074
75 ~Module();
76
Shih-wei Liao22add6f2012-12-15 17:21:00 -080077 const std::string& name() const { return m_Name; }
78
79 void setName(const std::string& pName) { m_Name = pName; }
80
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070081 const LinkerScript& getScript() const { return m_Script; }
82
83 LinkerScript& getScript() { return m_Script; }
84
Shih-wei Liao22add6f2012-12-15 17:21:00 -080085 // ----- 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
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800134/// @}
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 ----- //
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700149 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
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800155 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
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700164 // ----- 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
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800173private:
174 std::string m_Name;
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700175 LinkerScript& m_Script;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800176 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;
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700183 std::vector<AliasList*> m_AliasLists;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800184};
185
186} // namespace of mcld
187
188#endif
189