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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ELFSegmentFactory.h> 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//========================== 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// ELFSegmentFactory 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFSegmentFactory::ELFSegmentFactory(size_t pNum) 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : GCFactory<ELFSegment, 0>(pNum) 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoELFSegmentFactory::~ELFSegmentFactory() 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// produce - produce an empty ELF segment information. 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// this function will create an ELF segment 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// @param pType - p_type in ELF program header 28affc150dc44fab1911775a49636d0ce85333b634Zonr ChangELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ELFSegment* segment = allocate(); 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang new (segment) ELFSegment(pType, pFlag); 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return segment; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 35affc150dc44fab1911775a49636d0ce85333b634Zonr ChangELFSegment* 36affc150dc44fab1911775a49636d0ce85333b634Zonr ChangELFSegmentFactory::find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear) 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang iterator segment, segEnd = end(); 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (segment = begin(); segment != segEnd; ++segment) { 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if ((*segment).type() == pType && 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ((*segment).flag() & pFlagSet) == pFlagSet && 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ((*segment).flag() & pFlagClear) == 0x0) { 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return &(*segment); 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 49affc150dc44fab1911775a49636d0ce85333b634Zonr Changconst ELFSegment* 50affc150dc44fab1911775a49636d0ce85333b634Zonr ChangELFSegmentFactory::find(uint32_t pType, 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t pFlagSet, 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t pFlagClear) const 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_iterator segment, segEnd = end(); 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (segment = begin(); segment != segEnd; ++segment) { 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if ((*segment).type() == pType && 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ((*segment).flag() & pFlagSet) == pFlagSet && 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ((*segment).flag() & pFlagClear) == 0x0) { 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return &(*segment); 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 65