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//===----------------------------------------------------------------------===// 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_MODULE_H 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_MODULE_H 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector> 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string> 21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <map> 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LinkerScript.h> 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h> 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/ADT/HashTable.h> 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/ADT/HashEntry.h> 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/GCFactoryListTraits.h> 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/Fragment.h> 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/NamePool.h> 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionSymbolSet.h> 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/SymbolCategory.h> 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/MCLDInput.h> 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/ADT/ilist.h> 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSymbol; 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class Module 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Module provides the intermediate representation for linking. 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<Input*> ObjectList; 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef ObjectList::iterator obj_iterator; 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef ObjectList::const_iterator const_obj_iterator; 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<Input*> LibraryList; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef LibraryList::iterator lib_iterator; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef LibraryList::const_iterator const_lib_iterator; 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef InputTree::iterator input_iterator; 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef InputTree::const_iterator const_input_iterator; 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef std::vector<LDSection*> SectionTable; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionTable::iterator iterator; 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SectionTable::const_iterator const_iterator; 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolCategory SymbolTable; 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolTable::iterator sym_iterator; 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef SymbolTable::const_iterator const_sym_iterator; 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef std::vector<const ResolveInfo*> AliasList; 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef AliasList::iterator alias_iterator; 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef AliasList::const_iterator const_alias_iterator; 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines explicit Module(LinkerScript& pScript); 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module(const std::string& pName, LinkerScript& pScript); 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~Module(); 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const std::string& name() const { return m_Name; } 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setName(const std::string& pName) { m_Name = pName; } 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerScript& getScript() const { return m_Script; } 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LinkerScript& getScript() { return m_Script; } 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in objects ----- // 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const ObjectList& getObjectList() const { return m_ObjectList; } 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectList& getObjectList() { return m_ObjectList; } 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_obj_iterator obj_begin() const { return m_ObjectList.begin(); } 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao obj_iterator obj_begin() { return m_ObjectList.begin(); } 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_obj_iterator obj_end () const { return m_ObjectList.end(); } 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao obj_iterator obj_end () { return m_ObjectList.end(); } 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in libraries ----- // 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LibraryList& getLibraryList() const { return m_LibraryList; } 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LibraryList& getLibraryList() { return m_LibraryList; } 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_lib_iterator lib_begin() const { return m_LibraryList.begin(); } 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao lib_iterator lib_begin() { return m_LibraryList.begin(); } 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_lib_iterator lib_end () const { return m_LibraryList.end(); } 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao lib_iterator lib_end () { return m_LibraryList.end(); } 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- link-in inputs ----- // 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const InputTree& getInputTree() const { return m_MainTree; } 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao InputTree& getInputTree() { return m_MainTree; } 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_input_iterator input_begin() const { return m_MainTree.begin(); } 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao input_iterator input_begin() { return m_MainTree.begin(); } 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_input_iterator input_end () const { return m_MainTree.end(); } 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao input_iterator input_end () { return m_MainTree.end(); } 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @} 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @name Section Accessors 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @{ 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- sections ----- // 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SectionTable& getSectionTable() const { return m_SectionTable; } 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionTable& getSectionTable() { return m_SectionTable; } 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator begin() { return m_SectionTable.begin(); } 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_iterator begin() const { return m_SectionTable.begin(); } 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao iterator end () { return m_SectionTable.end(); } 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_iterator end () const { return m_SectionTable.end(); } 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* front() { return m_SectionTable.front(); } 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* front() const { return m_SectionTable.front(); } 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* back () { return m_SectionTable.back(); } 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* back () const { return m_SectionTable.back(); } 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t size () const { return m_SectionTable.size(); } 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool empty() const { return m_SectionTable.empty(); } 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection* getSection(const std::string& pName); 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LDSection* getSection(const std::string& pName) const; 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @} 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @name Symbol Accessors 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @{ 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- symbols ----- // 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SymbolTable& getSymbolTable() const { return m_SymbolTable; } 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymbolTable& getSymbolTable() { return m_SymbolTable; } 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym_iterator sym_begin() { return m_SymbolTable.begin(); } 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_sym_iterator sym_begin() const { return m_SymbolTable.begin(); } 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao sym_iterator sym_end () { return m_SymbolTable.end(); } 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_sym_iterator sym_end () const { return m_SymbolTable.end(); } 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t sym_size () const { return m_SymbolTable.numOfSymbols(); } 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- section symbols ----- // 149f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSymbol* getSectionSymbol(const LDSection& pSection) const 150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return m_SectSymbolSet.get(pSection); } 151f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 152f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol* getSectionSymbol(const LDSection& pSection) 153f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return m_SectSymbolSet.get(pSection); } 154f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const SectionSymbolSet& getSectionSymbolSet() const 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { return m_SectSymbolSet; } 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionSymbolSet& getSectionSymbolSet() 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { return m_SectSymbolSet; } 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- names ----- // 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const NamePool& getNamePool() const { return m_NamePool; } 16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao NamePool& getNamePool() { return m_NamePool; } 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 164f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // ----- Aliases ----- // 165f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // create an alias list for pSym, the aliases of pSym 166f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // can be added into the list by calling addAlias 167f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void CreateAliasList(const ResolveInfo& pSym); 168f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 169f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // add pAlias into the newly created alias list 170f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addAlias(const ResolveInfo& pAlias); 171f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AliasList* getAliasList(const ResolveInfo& pSym); 172f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::string m_Name; 175f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LinkerScript& m_Script; 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ObjectList m_ObjectList; 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LibraryList m_LibraryList; 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao InputTree m_MainTree; 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionTable m_SectionTable; 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SymbolTable m_SymbolTable; 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao NamePool m_NamePool; 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionSymbolSet m_SectSymbolSet; 183f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines std::vector<AliasList*> m_AliasLists; 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 190