ELFSegmentFactory.h revision 533eae20118036f425f27bf0536ef0ccbb090b65
1//===- ELFSegmentFactory.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_LD_ELFSEGMENTFACTORY_H
10#define MCLD_LD_ELFSEGMENTFACTORY_H
11
12#include <llvm/Support/DataTypes.h>
13#include <llvm/Support/ELF.h>
14#include <vector>
15
16namespace mcld
17{
18
19class ELFSegment;
20class LDSection;
21
22/** \class ELFSegmentFactory
23 *  \brief provide the interface to create and delete an ELFSegment
24 */
25class ELFSegmentFactory
26{
27public:
28  typedef std::vector<ELFSegment*> Segments;
29  typedef Segments::const_iterator const_iterator;
30  typedef Segments::iterator iterator;
31
32  const_iterator begin() const { return m_Segments.begin(); }
33  iterator       begin()       { return m_Segments.begin(); }
34  const_iterator end()   const { return m_Segments.end(); }
35  iterator       end()         { return m_Segments.end(); }
36
37  const ELFSegment* front() const { return m_Segments.front(); }
38  ELFSegment*       front()       { return m_Segments.front(); }
39  const ELFSegment* back()  const { return m_Segments.back(); }
40  ELFSegment*       back()        { return m_Segments.back(); }
41
42  size_t size() const { return m_Segments.size(); }
43
44  bool empty() const { return m_Segments.empty(); }
45
46  iterator find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear);
47
48  const_iterator
49  find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear) const;
50
51  iterator       find(uint32_t pType, const LDSection* pSection);
52
53  const_iterator find(uint32_t pType, const LDSection* pSection) const;
54
55  /// produce - produce an empty ELF segment information.
56  /// this function will create an ELF segment
57  /// @param pType - p_type in ELF program header
58  ELFSegment* produce(uint32_t pType, uint32_t pFlag = llvm::ELF::PF_R);
59
60  void erase(iterator pSegment);
61
62private:
63  Segments m_Segments;
64};
65
66} // namespace of mcld
67
68#endif
69
70