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