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