| //===- 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" |
| |
| 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(); |
| } |
| |
| ELFSegment* ELFSegmentFactory::insert(iterator pPosition, |
| uint32_t pType, |
| uint32_t pFlag) { |
| return *(m_Segments.insert(pPosition, ELFSegment::Create(pType, pFlag))); |
| } |
| |
| void ELFSegmentFactory::erase(iterator pSegment) { |
| m_Segments.erase(pSegment); |
| } |
| |
| } // namespace mcld |