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
11 using namespace mcld;
12
13 //==========================
14 // ELFSegmentFactory
15
ELFSegmentFactory(size_t pNum)16 ELFSegmentFactory::ELFSegmentFactory(size_t pNum)
17 : GCFactory<ELFSegment, 0>(pNum)
18 {
19 }
20
~ELFSegmentFactory()21 ELFSegmentFactory::~ELFSegmentFactory()
22 {
23 }
24
25 /// produce - produce an empty ELF segment information.
26 /// this function will create an ELF segment
27 /// @param pType - p_type in ELF program header
produce(uint32_t pType,uint32_t pFlag)28 ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag)
29 {
30 ELFSegment* segment = allocate();
31 new (segment) ELFSegment(pType, pFlag);
32 return segment;
33 }
34
35 ELFSegment*
find(uint32_t pType,uint32_t pFlagSet,uint32_t pFlagClear)36 ELFSegmentFactory::find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear)
37 {
38 iterator segment, segEnd = end();
39 for (segment = begin(); segment != segEnd; ++segment) {
40 if ((*segment).type() == pType &&
41 ((*segment).flag() & pFlagSet) == pFlagSet &&
42 ((*segment).flag() & pFlagClear) == 0x0) {
43 return &(*segment);
44 }
45 }
46 return NULL;
47 }
48
49 const ELFSegment*
find(uint32_t pType,uint32_t pFlagSet,uint32_t pFlagClear) const50 ELFSegmentFactory::find(uint32_t pType,
51 uint32_t pFlagSet,
52 uint32_t pFlagClear) const
53 {
54 const_iterator segment, segEnd = end();
55 for (segment = begin(); segment != segEnd; ++segment) {
56 if ((*segment).type() == pType &&
57 ((*segment).flag() & pFlagSet) == pFlagSet &&
58 ((*segment).flag() & pFlagClear) == 0x0) {
59 return &(*segment);
60 }
61 }
62 return NULL;
63 }
64
65