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#include "mcld/LD/ELFSegment.h" 11 12namespace mcld { 13 14//===----------------------------------------------------------------------===// 15// ELFSegmentFactory 16//===----------------------------------------------------------------------===// 17 18ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, 19 uint32_t pFlagSet, 20 uint32_t pFlagClear) { 21 iterator segment, segEnd = end(); 22 for (segment = begin(); segment != segEnd; ++segment) { 23 if ((*segment)->type() == pType && 24 ((*segment)->flag() & pFlagSet) == pFlagSet && 25 ((*segment)->flag() & pFlagClear) == 0x0) { 26 return segment; 27 } 28 } 29 return segEnd; 30} 31 32ELFSegmentFactory::const_iterator ELFSegmentFactory::find( 33 uint32_t pType, 34 uint32_t pFlagSet, 35 uint32_t pFlagClear) const { 36 const_iterator segment, segEnd = end(); 37 for (segment = begin(); segment != segEnd; ++segment) { 38 if ((*segment)->type() == pType && 39 ((*segment)->flag() & pFlagSet) == pFlagSet && 40 ((*segment)->flag() & pFlagClear) == 0x0) { 41 return segment; 42 } 43 } 44 return segEnd; 45} 46 47ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, 48 const LDSection* pSection) { 49 iterator segment, segEnd = end(); 50 for (segment = begin(); segment != segEnd; ++segment) { 51 if ((*segment)->type() == pType) { 52 ELFSegment::iterator sect, sectEnd = (*segment)->end(); 53 for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { 54 if (*sect == pSection) 55 return segment; 56 } // for each section 57 } 58 } // for each segment 59 return segEnd; 60} 61 62ELFSegmentFactory::const_iterator ELFSegmentFactory::find( 63 uint32_t pType, 64 const LDSection* pSection) const { 65 const_iterator segment, segEnd = end(); 66 for (segment = begin(); segment != segEnd; ++segment) { 67 if ((*segment)->type() == pType) { 68 ELFSegment::const_iterator sect, sectEnd = (*segment)->end(); 69 for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { 70 if (*sect == pSection) 71 return segment; 72 } // for each section 73 } 74 } // for each segment 75 return segEnd; 76} 77 78ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) { 79 m_Segments.push_back(ELFSegment::Create(pType, pFlag)); 80 return back(); 81} 82 83ELFSegment* ELFSegmentFactory::insert(iterator pPosition, 84 uint32_t pType, 85 uint32_t pFlag) { 86 return *(m_Segments.insert(pPosition, ELFSegment::Create(pType, pFlag))); 87} 88 89void ELFSegmentFactory::erase(iterator pSegment) { 90 m_Segments.erase(pSegment); 91} 92 93} // namespace mcld 94