122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- SectionMap.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#ifndef MCLD_SECTION_MAP_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_SECTION_MAP_H
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/DataTypes.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class SectionMap
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief descirbe the mappings of input section's name (or prefix) to
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *         its associated output section's name and offset
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionMap
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // a mapping in SectionMap is the triple of
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // {input substr, output section's name, output section's offset}
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  struct NamePair
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    NamePair();
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    NamePair(const std::string& pFrom, const std::string& pTo);
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    bool isNull() const;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    unsigned int hash;
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    std::string from;
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    std::string to;
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<NamePair> NamePairList;
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef NamePairList::iterator iterator;
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef NamePairList::const_iterator const_iterator;
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// NullName - the null object of NamePair
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static NamePair NullName;
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // get the possible output section name based on the mapping table
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // return NullPair if not found
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const NamePair& find(const std::string& pFrom) const;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePair&       find(const std::string& pFrom);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const NamePair& find(const std::string& pFrom, unsigned int pHash) const;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePair&       find(const std::string& pFrom, unsigned int pHash);
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // add a mapping from input sub-string to output name.
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // @param [in]  pFrom  the given input sub-string
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // @param [in]  pTo    the mapped output string
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // @param [out] pExist does pFrom exist?
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePair& append(const std::string& pFrom,
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                   const std::string& pTo,
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                   bool& pExist);
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator begin() const { return m_NamePairList.begin(); }
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       begin()       { return m_NamePairList.begin(); }
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator end  () const { return m_NamePairList.end(); }
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       end  ()       { return m_NamePairList.end(); }
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool           empty() const { return m_NamePairList.empty(); }
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t         size () const { return m_NamePairList.size(); }
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static unsigned int hash(const std::string& pString);
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool matched(const NamePair& pNamePair,
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               const std::string& pInput,
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               unsigned int pHash) const;
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  NamePairList m_NamePairList;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
91