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
12 namespace mcld {
13
14 //===----------------------------------------------------------------------===//
15 // ELFSegmentFactory
16 //===----------------------------------------------------------------------===//
17
find(uint32_t pType,uint32_t pFlagSet,uint32_t pFlagClear)18 ELFSegmentFactory::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
find(uint32_t pType,uint32_t pFlagSet,uint32_t pFlagClear) const32 ELFSegmentFactory::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
find(uint32_t pType,const LDSection * pSection)47 ELFSegmentFactory::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
find(uint32_t pType,const LDSection * pSection) const62 ELFSegmentFactory::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
produce(uint32_t pType,uint32_t pFlag)78 ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) {
79 m_Segments.push_back(ELFSegment::Create(pType, pFlag));
80 return back();
81 }
82
insert(iterator pPosition,uint32_t pType,uint32_t pFlag)83 ELFSegment* ELFSegmentFactory::insert(iterator pPosition,
84 uint32_t pType,
85 uint32_t pFlag) {
86 return *(m_Segments.insert(pPosition, ELFSegment::Create(pType, pFlag)));
87 }
88
erase(iterator pSegment)89 void ELFSegmentFactory::erase(iterator pSegment) {
90 m_Segments.erase(pSegment);
91 }
92
93 } // namespace mcld
94