ELFSegmentFactory.cpp revision 37b74a387bb3993387029859c2d9d051c41c724e
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ELFSegmentFactory.cpp ----------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegmentFactory.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegment.h" 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ELFSegmentFactory 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1837b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pFlagSet, 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pFlagClear) { 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang iterator segment, segEnd = end(); 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (segment = begin(); segment != segEnd; ++segment) { 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if ((*segment)->type() == pType && 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ((*segment)->flag() & pFlagSet) == pFlagSet && 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ((*segment)->flag() & pFlagClear) == 0x0) { 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segment; 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segEnd; 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 3237b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegmentFactory::const_iterator ELFSegmentFactory::find( 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pType, 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pFlagSet, 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pFlagClear) const { 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_iterator segment, segEnd = end(); 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (segment = begin(); segment != segEnd; ++segment) { 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if ((*segment)->type() == pType && 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ((*segment)->flag() & pFlagSet) == pFlagSet && 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ((*segment)->flag() & pFlagClear) == 0x0) { 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segment; 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segEnd; 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 4737b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection* pSection) { 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines iterator segment, segEnd = end(); 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (segment = begin(); segment != segEnd; ++segment) { 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if ((*segment)->type() == pType) { 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ELFSegment::iterator sect, sectEnd = (*segment)->end(); 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (*sect == pSection) 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segment; 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each section 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each segment 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segEnd; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6237b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegmentFactory::const_iterator ELFSegmentFactory::find( 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint32_t pType, 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSection* pSection) const { 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const_iterator segment, segEnd = end(); 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (segment = begin(); segment != segEnd; ++segment) { 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if ((*segment)->type() == pType) { 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ELFSegment::const_iterator sect, sectEnd = (*segment)->end(); 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (*sect == pSection) 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segment; 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each section 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } // for each segment 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return segEnd; 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 7837b74a387bb3993387029859c2d9d051c41c724eStephen HinesELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) { 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Segments.push_back(ELFSegment::Create(pType, pFlag)); 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return back(); 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ELFSegmentFactory::erase(iterator pSegment) { 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Segments.erase(pSegment); 85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 88