//===- 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 <llvm/Support/DataTypes.h>
#include <vector>
#include <string>
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 Mapping {
std::string inputSubStr;
std::string outputStr;
};
typedef std::vector<struct Mapping> SectionMappingTy;
typedef SectionMappingTy::iterator iterator;
typedef SectionMappingTy::const_iterator const_iterator;
public:
SectionMap();
~SectionMap();
// get the possible output section name based on the mapping table
// return NULL if not found
const std::string& getOutputSectName(const std::string& pInput);
// add a mapping from input substr to output name and offset.
bool push_back(const std::string& pInput,
const std::string& pOutput);
// find - return the iterator to the mapping
iterator find(const std::string& pInput);
// at - return the pointer to the mapping
Mapping* at(const std::string& pInput);
// ----- observers ----- //
bool empty() const
{ return m_SectMap.empty(); }
size_t size() const
{ return m_SectMap.size(); }
size_t capacity () const
{ return m_SectMap.capacity(); }
// ----- iterators ----- //
iterator begin()
{ return m_SectMap.begin(); }
iterator end()
{ return m_SectMap.end(); }
const_iterator begin() const
{ return m_SectMap.begin(); }
const_iterator end() const
{ return m_SectMap.end(); }
// initStdSectionMap - add common mappings of ELF and other formats
// to SectionMap
bool initStdSectionMap();
private:
struct SectionNameMapping {
const char* from;
const char* to;
};
// used to store common mappings of ELF and other formants
static const SectionNameMapping m_StdSectionMap[];
static const int m_StdSectionMapSize;
SectionMappingTy m_SectMap;
};
} // namespace of mcld
#endif