ELFSegmentFactory.cpp revision affc150dc44fab1911775a49636d0ce85333b634
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
11using namespace mcld;
12
13//==========================
14// ELFSegmentFactory
15
16ELFSegmentFactory::ELFSegmentFactory(size_t pNum)
17  : GCFactory<ELFSegment, 0>(pNum)
18{
19}
20
21ELFSegmentFactory::~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
28ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag)
29{
30  ELFSegment* segment = allocate();
31  new (segment) ELFSegment(pType, pFlag);
32  return segment;
33}
34
35ELFSegment*
36ELFSegmentFactory::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
49const ELFSegment*
50ELFSegmentFactory::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