Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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> |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 21 | #include <map> |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 22 | |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 23 | #include <mcld/LinkerScript.h> |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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 | |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 34 | #include <llvm/ADT/ilist.h> |
| 35 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 36 | namespace mcld { |
| 37 | |
| 38 | class LDSection; |
| 39 | class LDSymbol; |
| 40 | |
| 41 | /** \class Module |
| 42 | * \brief Module provides the intermediate representation for linking. |
| 43 | */ |
| 44 | class Module |
| 45 | { |
| 46 | public: |
| 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 Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 66 | typedef std::vector<const ResolveInfo*> AliasList; |
| 67 | typedef AliasList::iterator alias_iterator; |
| 68 | typedef AliasList::const_iterator const_alias_iterator; |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 69 | |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 70 | public: |
| 71 | explicit Module(LinkerScript& pScript); |
| 72 | |
| 73 | Module(const std::string& pName, LinkerScript& pScript); |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 74 | |
| 75 | ~Module(); |
| 76 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 77 | const std::string& name() const { return m_Name; } |
| 78 | |
| 79 | void setName(const std::string& pName) { m_Name = pName; } |
| 80 | |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 81 | const LinkerScript& getScript() const { return m_Script; } |
| 82 | |
| 83 | LinkerScript& getScript() { return m_Script; } |
| 84 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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 ----- // |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 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 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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 | |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 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 | |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 173 | private: |
| 174 | std::string m_Name; |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 175 | LinkerScript& m_Script; |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 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; |
Stephen Hines | f7ac0f1 | 2013-05-03 19:09:24 -0700 | [diff] [blame] | 183 | std::vector<AliasList*> m_AliasLists; |
Shih-wei Liao | 22add6f | 2012-12-15 17:21:00 -0800 | [diff] [blame] | 184 | }; |
| 185 | |
| 186 | } // namespace of mcld |
| 187 | |
| 188 | #endif |
| 189 | |