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
15#include <vector>
16
17namespace mcld {
18
19class ELFSegment;
20class LDSection;
21
22/** \class ELFSegmentFactory
23 *  \brief provide the interface to create and delete an ELFSegment
24 */
25class ELFSegmentFactory {
26 public:
27  typedef std::vector<ELFSegment*> Segments;
28  typedef Segments::const_iterator const_iterator;
29  typedef Segments::iterator iterator;
30
31  const_iterator begin() const { return m_Segments.begin(); }
32  iterator begin() { return m_Segments.begin(); }
33  const_iterator end() const { return m_Segments.end(); }
34  iterator end() { return m_Segments.end(); }
35
36  const ELFSegment* front() const { return m_Segments.front(); }
37  ELFSegment* front() { return m_Segments.front(); }
38  const ELFSegment* back() const { return m_Segments.back(); }
39  ELFSegment* back() { return m_Segments.back(); }
40
41  size_t size() const { return m_Segments.size(); }
42
43  bool empty() const { return m_Segments.empty(); }
44
45  iterator find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear);
46
47  const_iterator find(uint32_t pType,
48                      uint32_t pFlagSet,
49                      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  ELFSegment* insert(iterator pPosition,
61                     uint32_t pType,
62                     uint32_t pFlag = llvm::ELF::PF_R);
63
64  void erase(iterator pSegment);
65
66 private:
67  Segments m_Segments;
68};
69
70}  // namespace mcld
71
72#endif  // MCLD_LD_ELFSEGMENTFACTORY_H_
73