//===- ELFSegmentFactory.cpp ----------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/ELFSegmentFactory.h>
using namespace mcld;
//==========================
// ELFSegmentFactory
ELFSegmentFactory::ELFSegmentFactory(size_t pNum)
: GCFactory<ELFSegment, 0>(pNum)
{
}
ELFSegmentFactory::~ELFSegmentFactory()
{
}
/// produce - produce an empty ELF segment information.
/// this function will create an ELF segment
/// @param pType - p_type in ELF program header
ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag)
{
ELFSegment* segment = allocate();
new (segment) ELFSegment(pType, pFlag);
return segment;
}
ELFSegment*
ELFSegmentFactory::find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear)
{
iterator segment, segEnd = end();
for (segment = begin(); segment != segEnd; ++segment) {
if ((*segment).type() == pType &&
((*segment).flag() & pFlagSet) == pFlagSet &&
((*segment).flag() & pFlagClear) == 0x0) {
return &(*segment);
}
}
return NULL;
}
const ELFSegment*
ELFSegmentFactory::find(uint32_t pType,
uint32_t pFlagSet,
uint32_t pFlagClear) const
{
const_iterator segment, segEnd = end();
for (segment = begin(); segment != segEnd; ++segment) {
if ((*segment).type() == pType &&
((*segment).flag() & pFlagSet) == pFlagSet &&
((*segment).flag() & pFlagClear) == 0x0) {
return &(*segment);
}
}
return NULL;
}