//===- 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; }