1//===- SectionMap.h -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_SECTION_MAP_H
10#define MCLD_SECTION_MAP_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <llvm/Support/DataTypes.h>
16#include <vector>
17#include <string>
18
19namespace mcld
20{
21
22/** \class SectionMap
23 *  \brief descirbe the mappings of input section's name (or prefix) to
24 *         its associated output section's name and offset
25 */
26class SectionMap
27{
28public:
29  // a mapping in SectionMap is the triple of
30  // {input substr, output section's name, output section's offset}
31  struct Mapping {
32    std::string inputSubStr;
33    std::string outputStr;
34  };
35
36  typedef std::vector<struct Mapping> SectionMappingTy;
37
38  typedef SectionMappingTy::iterator iterator;
39  typedef SectionMappingTy::const_iterator const_iterator;
40
41public:
42  SectionMap();
43  ~SectionMap();
44
45  // get the possible output section name based on the mapping table
46  // return NULL if not found
47  const std::string& getOutputSectName(const std::string& pInput);
48
49  // add a mapping from input substr to output name and offset.
50  bool push_back(const std::string& pInput,
51                 const std::string& pOutput);
52
53  // find - return the iterator to the mapping
54  iterator find(const std::string& pInput);
55
56  // at - return the pointer to the mapping
57  Mapping* at(const std::string& pInput);
58
59  // -----  observers  ----- //
60  bool empty() const
61  { return m_SectMap.empty(); }
62
63  size_t size() const
64  { return m_SectMap.size(); }
65
66  size_t capacity () const
67  { return m_SectMap.capacity(); }
68
69  // -----  iterators  ----- //
70  iterator begin()
71  { return m_SectMap.begin(); }
72
73  iterator end()
74  { return m_SectMap.end(); }
75
76  const_iterator begin() const
77  { return m_SectMap.begin(); }
78
79  const_iterator end() const
80  { return m_SectMap.end(); }
81
82  // initStdSectionMap - add common mappings of ELF and other formats
83  // to SectionMap
84  bool initStdSectionMap();
85
86private:
87  struct SectionNameMapping {
88    const char* from;
89    const char* to;
90  };
91
92  // used to store common mappings of ELF and other formants
93  static const SectionNameMapping m_StdSectionMap[];
94
95  static const int m_StdSectionMapSize;
96
97  SectionMappingTy m_SectMap;
98};
99
100} // namespace of mcld
101
102#endif
103
104