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