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 22 #include <llvm/ADT/ilist.h> 23 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 namespace mcld { 35 36 class LDSection; 37 class LDSymbol; 38 39 /** \class Module 40 * \brief Module provides the intermediate representation for linking. 41 */ 42 class Module 43 { 44 public: 45 typedef std::vector<Input*> ObjectList; 46 typedef ObjectList::iterator obj_iterator; 47 typedef ObjectList::const_iterator const_obj_iterator; 48 49 typedef std::vector<Input*> LibraryList; 50 typedef LibraryList::iterator lib_iterator; 51 typedef LibraryList::const_iterator const_lib_iterator; 52 53 typedef InputTree::iterator input_iterator; 54 typedef InputTree::const_iterator const_input_iterator; 55 56 typedef std::vector<LDSection*> SectionTable; 57 typedef SectionTable::iterator iterator; 58 typedef SectionTable::const_iterator const_iterator; 59 60 typedef SymbolCategory SymbolTable; 61 typedef SymbolTable::iterator sym_iterator; 62 typedef SymbolTable::const_iterator const_sym_iterator; 63 64 public: 65 Module(); 66 67 Module(const std::string& pName); 68 69 ~Module(); 70 71 // ----- name ----- // name()72 const std::string& name() const { return m_Name; } 73 setName(const std::string & pName)74 void setName(const std::string& pName) { m_Name = pName; } 75 76 // ----- link-in objects ----- // getObjectList()77 const ObjectList& getObjectList() const { return m_ObjectList; } getObjectList()78 ObjectList& getObjectList() { return m_ObjectList; } 79 obj_begin()80 const_obj_iterator obj_begin() const { return m_ObjectList.begin(); } obj_begin()81 obj_iterator obj_begin() { return m_ObjectList.begin(); } obj_end()82 const_obj_iterator obj_end () const { return m_ObjectList.end(); } obj_end()83 obj_iterator obj_end () { return m_ObjectList.end(); } 84 85 // ----- link-in libraries ----- // getLibraryList()86 const LibraryList& getLibraryList() const { return m_LibraryList; } getLibraryList()87 LibraryList& getLibraryList() { return m_LibraryList; } 88 lib_begin()89 const_lib_iterator lib_begin() const { return m_LibraryList.begin(); } lib_begin()90 lib_iterator lib_begin() { return m_LibraryList.begin(); } lib_end()91 const_lib_iterator lib_end () const { return m_LibraryList.end(); } lib_end()92 lib_iterator lib_end () { return m_LibraryList.end(); } 93 94 // ----- link-in inputs ----- // getInputTree()95 const InputTree& getInputTree() const { return m_MainTree; } getInputTree()96 InputTree& getInputTree() { return m_MainTree; } 97 input_begin()98 const_input_iterator input_begin() const { return m_MainTree.begin(); } input_begin()99 input_iterator input_begin() { return m_MainTree.begin(); } input_end()100 const_input_iterator input_end () const { return m_MainTree.end(); } input_end()101 input_iterator input_end () { return m_MainTree.end(); } 102 103 /// @} 104 /// @name Section Accessors 105 /// @{ 106 107 // ----- sections ----- // getSectionTable()108 const SectionTable& getSectionTable() const { return m_SectionTable; } getSectionTable()109 SectionTable& getSectionTable() { return m_SectionTable; } 110 begin()111 iterator begin() { return m_SectionTable.begin(); } begin()112 const_iterator begin() const { return m_SectionTable.begin(); } end()113 iterator end () { return m_SectionTable.end(); } end()114 const_iterator end () const { return m_SectionTable.end(); } front()115 LDSection* front() { return m_SectionTable.front(); } front()116 const LDSection* front() const { return m_SectionTable.front(); } back()117 LDSection* back () { return m_SectionTable.back(); } back()118 const LDSection* back () const { return m_SectionTable.back(); } size()119 size_t size () const { return m_SectionTable.size(); } empty()120 bool empty() const { return m_SectionTable.empty(); } 121 122 LDSection* getSection(const std::string& pName); 123 const LDSection* getSection(const std::string& pName) const; 124 125 LDSymbol* getSectionSymbol(const LDSection* pSection); 126 const LDSymbol* getSectionSymbol(const LDSection* pSection) const; 127 128 /// @} 129 /// @name Symbol Accessors 130 /// @{ 131 132 // ----- symbols ----- // getSymbolTable()133 const SymbolTable& getSymbolTable() const { return m_SymbolTable; } getSymbolTable()134 SymbolTable& getSymbolTable() { return m_SymbolTable; } 135 sym_begin()136 sym_iterator sym_begin() { return m_SymbolTable.begin(); } sym_begin()137 const_sym_iterator sym_begin() const { return m_SymbolTable.begin(); } sym_end()138 sym_iterator sym_end () { return m_SymbolTable.end(); } sym_end()139 const_sym_iterator sym_end () const { return m_SymbolTable.end(); } sym_size()140 size_t sym_size () const { return m_SymbolTable.numOfSymbols(); } 141 142 // ----- section symbols ----- // getSectionSymbolSet()143 const SectionSymbolSet& getSectionSymbolSet() const 144 { return m_SectSymbolSet; } getSectionSymbolSet()145 SectionSymbolSet& getSectionSymbolSet() 146 { return m_SectSymbolSet; } 147 148 // ----- names ----- // getNamePool()149 const NamePool& getNamePool() const { return m_NamePool; } getNamePool()150 NamePool& getNamePool() { return m_NamePool; } 151 152 private: 153 std::string m_Name; 154 ObjectList m_ObjectList; 155 LibraryList m_LibraryList; 156 InputTree m_MainTree; 157 SectionTable m_SectionTable; 158 SymbolTable m_SymbolTable; 159 NamePool m_NamePool; 160 SectionSymbolSet m_SectSymbolSet; 161 }; 162 163 } // namespace of mcld 164 165 #endif 166 167