122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Module.h -----------------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Module contains the intermediate representation (LDIR) of MCLinker. 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_MODULE_H_ 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_MODULE_H_ 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/NamePool.h" 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionSymbolSet.h" 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/SymbolCategory.h" 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector> 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input; 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerScript; 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSymbol; 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class Module 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Module provides the intermediate representation for linking. 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Module { 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<Input*> ObjectList; 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef ObjectList::iterator obj_iterator; 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef ObjectList::const_iterator const_obj_iterator; 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<Input*> LibraryList; 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef LibraryList::iterator lib_iterator; 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef LibraryList::const_iterator const_lib_iterator; 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef InputTree::iterator input_iterator; 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef InputTree::const_iterator const_input_iterator; 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<LDSection*> SectionTable; 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionTable::iterator iterator; 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionTable::const_iterator const_iterator; 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolCategory SymbolTable; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolTable::iterator sym_iterator; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolTable::const_iterator const_sym_iterator; 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef std::vector<const ResolveInfo*> AliasList; 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef AliasList::iterator alias_iterator; 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef AliasList::const_iterator const_alias_iterator; 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines explicit Module(LinkerScript& pScript); 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module(const std::string& pName, LinkerScript& pScript); 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~Module(); 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const std::string& name() const { return m_Name; } 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setName(const std::string& pName) { m_Name = pName; } 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerScript& getScript() const { return m_Script; } 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LinkerScript& getScript() { return m_Script; } 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in objects ----- // 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const ObjectList& getObjectList() const { return m_ObjectList; } 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ObjectList& getObjectList() { return m_ObjectList; } 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_obj_iterator obj_begin() const { return m_ObjectList.begin(); } 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines obj_iterator obj_begin() { return m_ObjectList.begin(); } 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_obj_iterator obj_end() const { return m_ObjectList.end(); } 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines obj_iterator obj_end() { return m_ObjectList.end(); } 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in libraries ----- // 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LibraryList& getLibraryList() const { return m_LibraryList; } 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LibraryList& getLibraryList() { return m_LibraryList; } 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_lib_iterator lib_begin() const { return m_LibraryList.begin(); } 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines lib_iterator lib_begin() { return m_LibraryList.begin(); } 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_lib_iterator lib_end() const { return m_LibraryList.end(); } 9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines lib_iterator lib_end() { return m_LibraryList.end(); } 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in inputs ----- // 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const InputTree& getInputTree() const { return m_MainTree; } 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines InputTree& getInputTree() { return m_MainTree; } 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_input_iterator input_begin() const { return m_MainTree.begin(); } 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines input_iterator input_begin() { return m_MainTree.begin(); } 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_input_iterator input_end() const { return m_MainTree.end(); } 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines input_iterator input_end() { return m_MainTree.end(); } 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @} 10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @name Section Accessors 10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @{ 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- sections ----- // 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SectionTable& getSectionTable() const { return m_SectionTable; } 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionTable& getSectionTable() { return m_SectionTable; } 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator begin() { return m_SectionTable.begin(); } 11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator begin() const { return m_SectionTable.begin(); } 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator end() { return m_SectionTable.end(); } 11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator end() const { return m_SectionTable.end(); } 11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* front() { return m_SectionTable.front(); } 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* front() const { return m_SectionTable.front(); } 11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* back() { return m_SectionTable.back(); } 11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection* back() const { return m_SectionTable.back(); } 11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t size() const { return m_SectionTable.size(); } 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool empty() const { return m_SectionTable.empty(); } 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection* getSection(const std::string& pName); 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* getSection(const std::string& pName) const; 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @} 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @name Symbol Accessors 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// @{ 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- symbols ----- // 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SymbolTable& getSymbolTable() const { return m_SymbolTable; } 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines SymbolTable& getSymbolTable() { return m_SymbolTable; } 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines sym_iterator sym_begin() { return m_SymbolTable.begin(); } 13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_sym_iterator sym_begin() const { return m_SymbolTable.begin(); } 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines sym_iterator sym_end() { return m_SymbolTable.end(); } 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_sym_iterator sym_end() const { return m_SymbolTable.end(); } 13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t sym_size() const { return m_SymbolTable.numOfSymbols(); } 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- section symbols ----- // 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSymbol* getSectionSymbol(const LDSection& pSection) const { 13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return m_SectSymbolSet.get(pSection); 14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSymbol* getSectionSymbol(const LDSection& pSection) { 14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines return m_SectSymbolSet.get(pSection); 14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const SectionSymbolSet& getSectionSymbolSet() const { 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines return m_SectSymbolSet; 14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionSymbolSet& getSectionSymbolSet() { return m_SectSymbolSet; } 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- names ----- // 15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const NamePool& getNamePool() const { return m_NamePool; } 15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines NamePool& getNamePool() { return m_NamePool; } 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 155f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // ----- Aliases ----- // 156f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // create an alias list for pSym, the aliases of pSym 157f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // can be added into the list by calling addAlias 158f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void CreateAliasList(const ResolveInfo& pSym); 159f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 160f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // add pAlias into the newly created alias list 161f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addAlias(const ResolveInfo& pAlias); 162f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AliasList* getAliasList(const ResolveInfo& pSym); 163f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::string m_Name; 166f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LinkerScript& m_Script; 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectList m_ObjectList; 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LibraryList m_LibraryList; 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao InputTree m_MainTree; 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionTable m_SectionTable; 17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymbolTable m_SymbolTable; 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao NamePool m_NamePool; 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionSymbolSet m_SectSymbolSet; 174f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines std::vector<AliasList*> m_AliasLists; 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_MODULE_H_ 180