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