//===- SectionMap.h -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SECTION_MAP_H
#define MCLD_SECTION_MAP_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <vector>
#include <string>
#include <llvm/Support/DataTypes.h>
namespace mcld {
/** \class SectionMap
* \brief descirbe the mappings of input section's name (or prefix) to
* its associated output section's name and offset
*/
class SectionMap
{
public:
// a mapping in SectionMap is the triple of
// {input substr, output section's name, output section's offset}
struct NamePair
{
public:
NamePair();
NamePair(const std::string& pFrom, const std::string& pTo);
bool isNull() const;
public:
unsigned int hash;
std::string from;
std::string to;
};
typedef std::vector<NamePair> NamePairList;
typedef NamePairList::iterator iterator;
typedef NamePairList::const_iterator const_iterator;
/// NullName - the null object of NamePair
static NamePair NullName;
public:
// get the possible output section name based on the mapping table
// return NullPair if not found
const NamePair& find(const std::string& pFrom) const;
NamePair& find(const std::string& pFrom);
const NamePair& find(const std::string& pFrom, unsigned int pHash) const;
NamePair& find(const std::string& pFrom, unsigned int pHash);
// add a mapping from input sub-string to output name.
// @param [in] pFrom the given input sub-string
// @param [in] pTo the mapped output string
// @param [out] pExist does pFrom exist?
NamePair& append(const std::string& pFrom,
const std::string& pTo,
bool& pExist);
const_iterator begin() const { return m_NamePairList.begin(); }
iterator begin() { return m_NamePairList.begin(); }
const_iterator end () const { return m_NamePairList.end(); }
iterator end () { return m_NamePairList.end(); }
bool empty() const { return m_NamePairList.empty(); }
size_t size () const { return m_NamePairList.size(); }
static unsigned int hash(const std::string& pString);
private:
bool matched(const NamePair& pNamePair,
const std::string& pInput,
unsigned int pHash) const;
private:
NamePairList m_NamePairList;
};
} // namespace of mcld
#endif