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