Module.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/ADT/ilist.h>
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
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
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSymbol;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class Module
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief Module provides the intermediate representation for linking.
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<Input*> ObjectList;
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef ObjectList::iterator obj_iterator;
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef ObjectList::const_iterator const_obj_iterator;
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<Input*> LibraryList;
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef LibraryList::iterator lib_iterator;
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef LibraryList::const_iterator const_lib_iterator;
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef InputTree::iterator input_iterator;
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef InputTree::const_iterator const_input_iterator;
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<LDSection*> SectionTable;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionTable::iterator iterator;
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionTable::const_iterator const_iterator;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SymbolCategory SymbolTable;
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SymbolTable::iterator sym_iterator;
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SymbolTable::const_iterator const_sym_iterator;
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module();
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module(const std::string& pName);
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~Module();
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  name  ----- //
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const std::string& name() const { return m_Name; }
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void setName(const std::string& pName) { m_Name = pName; }
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  link-in objects ----- //
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const ObjectList& getObjectList() const { return m_ObjectList; }
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectList&       getObjectList()       { return m_ObjectList; }
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_obj_iterator obj_begin() const { return m_ObjectList.begin(); }
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  obj_iterator       obj_begin()       { return m_ObjectList.begin(); }
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_obj_iterator obj_end  () const { return m_ObjectList.end();   }
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  obj_iterator       obj_end  ()       { return m_ObjectList.end();   }
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  link-in libraries  ----- //
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LibraryList& getLibraryList() const { return m_LibraryList; }
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LibraryList&       getLibraryList()       { return m_LibraryList; }
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_lib_iterator lib_begin() const { return m_LibraryList.begin(); }
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  lib_iterator       lib_begin()       { return m_LibraryList.begin(); }
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_lib_iterator lib_end  () const { return m_LibraryList.end();   }
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  lib_iterator       lib_end  ()       { return m_LibraryList.end();   }
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  link-in inputs  ----- //
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const InputTree& getInputTree() const { return m_MainTree; }
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  InputTree&       getInputTree()       { return m_MainTree; }
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_input_iterator input_begin() const { return m_MainTree.begin(); }
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input_iterator       input_begin()       { return m_MainTree.begin(); }
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_input_iterator input_end  () const { return m_MainTree.end();   }
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input_iterator       input_end  ()       { return m_MainTree.end();   }
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @}
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @name Section Accessors
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @{
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  sections  ----- //
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SectionTable& getSectionTable() const { return m_SectionTable; }
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionTable&       getSectionTable()       { return m_SectionTable; }
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator         begin()       { return m_SectionTable.begin(); }
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator   begin() const { return m_SectionTable.begin(); }
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator         end  ()       { return m_SectionTable.end();   }
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator   end  () const { return m_SectionTable.end();   }
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection*       front()       { return m_SectionTable.front(); }
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSection* front() const { return m_SectionTable.front(); }
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection*       back ()       { return m_SectionTable.back();  }
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSection* back () const { return m_SectionTable.back();  }
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t           size () const { return m_SectionTable.size();  }
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool             empty() const { return m_SectionTable.empty(); }
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection*       getSection(const std::string& pName);
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSection* getSection(const std::string& pName) const;
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSymbol*       getSectionSymbol(const LDSection* pSection);
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSymbol* getSectionSymbol(const LDSection* pSection) const;
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @}
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @name Symbol Accessors
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @{
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  symbols  ----- //
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SymbolTable& getSymbolTable() const { return m_SymbolTable; }
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymbolTable&       getSymbolTable()       { return m_SymbolTable; }
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym_iterator       sym_begin()       { return m_SymbolTable.begin();         }
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_sym_iterator sym_begin() const { return m_SymbolTable.begin();         }
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  sym_iterator       sym_end  ()       { return m_SymbolTable.end();           }
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_sym_iterator sym_end  () const { return m_SymbolTable.end();           }
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t             sym_size () const { return m_SymbolTable.numOfSymbols();  }
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // ----- section symbols ----- //
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SectionSymbolSet& getSectionSymbolSet() const
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_SectSymbolSet; }
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionSymbolSet&       getSectionSymbolSet()
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_SectSymbolSet; }
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  names  ----- //
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const NamePool& getNamePool() const { return m_NamePool; }
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePool&       getNamePool()       { return m_NamePool; }
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::string m_Name;
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectList m_ObjectList;
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LibraryList m_LibraryList;
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  InputTree m_MainTree;
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionTable m_SectionTable;
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymbolTable m_SymbolTable;
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePool m_NamePool;
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionSymbolSet m_SectSymbolSet;
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
167