blob: 4d06629d5c84e63eae64a0e3660d2f2c98d718d4 [file] [log] [blame]
//===- 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>
#include <mcld/LD/ELFSegment.h>
using namespace mcld;
//===----------------------------------------------------------------------===//
// ELFSegmentFactory
//===----------------------------------------------------------------------===//
ELFSegmentFactory::iterator
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 segEnd;
}
ELFSegmentFactory::const_iterator
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 segEnd;
}
ELFSegmentFactory::iterator
ELFSegmentFactory::find(uint32_t pType, const LDSection* pSection)
{
iterator segment, segEnd = end();
for (segment = begin(); segment != segEnd; ++segment) {
if ((*segment)->type() == pType) {
ELFSegment::iterator sect, sectEnd = (*segment)->end();
for (sect = (*segment)->begin(); sect != sectEnd; ++sect) {
if (*sect == pSection)
return segment;
} // for each section
}
} // for each segment
return segEnd;
}
ELFSegmentFactory::const_iterator
ELFSegmentFactory::find(uint32_t pType, const LDSection* pSection) const
{
const_iterator segment, segEnd = end();
for (segment = begin(); segment != segEnd; ++segment) {
if ((*segment)->type() == pType) {
ELFSegment::const_iterator sect, sectEnd = (*segment)->end();
for (sect = (*segment)->begin(); sect != sectEnd; ++sect) {
if (*sect == pSection)
return segment;
} // for each section
}
} // for each segment
return segEnd;
}
ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag)
{
m_Segments.push_back(ELFSegment::Create(pType, pFlag));
return back();
}
void ELFSegmentFactory::erase(iterator pSegment)
{
m_Segments.erase(pSegment);
}