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