1//===- ELFSegmentFactory.cpp ----------------------------------------------===//
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#include "mcld/LD/ELFSegmentFactory.h"
10#include "mcld/LD/ELFSegment.h"
11
12namespace mcld {
13
14//===----------------------------------------------------------------------===//
15// ELFSegmentFactory
16//===----------------------------------------------------------------------===//
17
18ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType,
19                                                    uint32_t pFlagSet,
20                                                    uint32_t pFlagClear) {
21  iterator segment, segEnd = end();
22  for (segment = begin(); segment != segEnd; ++segment) {
23    if ((*segment)->type() == pType &&
24        ((*segment)->flag() & pFlagSet) == pFlagSet &&
25        ((*segment)->flag() & pFlagClear) == 0x0) {
26      return segment;
27    }
28  }
29  return segEnd;
30}
31
32ELFSegmentFactory::const_iterator ELFSegmentFactory::find(
33    uint32_t pType,
34    uint32_t pFlagSet,
35    uint32_t pFlagClear) const {
36  const_iterator segment, segEnd = end();
37  for (segment = begin(); segment != segEnd; ++segment) {
38    if ((*segment)->type() == pType &&
39        ((*segment)->flag() & pFlagSet) == pFlagSet &&
40        ((*segment)->flag() & pFlagClear) == 0x0) {
41      return segment;
42    }
43  }
44  return segEnd;
45}
46
47ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType,
48                                                    const LDSection* pSection) {
49  iterator segment, segEnd = end();
50  for (segment = begin(); segment != segEnd; ++segment) {
51    if ((*segment)->type() == pType) {
52      ELFSegment::iterator sect, sectEnd = (*segment)->end();
53      for (sect = (*segment)->begin(); sect != sectEnd; ++sect) {
54        if (*sect == pSection)
55          return segment;
56      }  // for each section
57    }
58  }  // for each segment
59  return segEnd;
60}
61
62ELFSegmentFactory::const_iterator ELFSegmentFactory::find(
63    uint32_t pType,
64    const LDSection* pSection) const {
65  const_iterator segment, segEnd = end();
66  for (segment = begin(); segment != segEnd; ++segment) {
67    if ((*segment)->type() == pType) {
68      ELFSegment::const_iterator sect, sectEnd = (*segment)->end();
69      for (sect = (*segment)->begin(); sect != sectEnd; ++sect) {
70        if (*sect == pSection)
71          return segment;
72      }  // for each section
73    }
74  }  // for each segment
75  return segEnd;
76}
77
78ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) {
79  m_Segments.push_back(ELFSegment::Create(pType, pFlag));
80  return back();
81}
82
83ELFSegment* ELFSegmentFactory::insert(iterator pPosition,
84                                      uint32_t pType,
85                                      uint32_t pFlag) {
86  return *(m_Segments.insert(pPosition, ELFSegment::Create(pType, pFlag)));
87}
88
89void ELFSegmentFactory::erase(iterator pSegment) {
90  m_Segments.erase(pSegment);
91}
92
93}  // namespace mcld
94