1*993229b6Sjkunz /* 2*993229b6Sjkunz * File: DataTarget.cpp 3*993229b6Sjkunz * 4*993229b6Sjkunz * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. 5*993229b6Sjkunz * See included license file for license details. 6*993229b6Sjkunz */ 7*993229b6Sjkunz 8*993229b6Sjkunz #include "DataTarget.h" 9*993229b6Sjkunz #include "DataSource.h" 10*993229b6Sjkunz #include "ElftosbErrors.h" 11*993229b6Sjkunz 12*993229b6Sjkunz using namespace elftosb; 13*993229b6Sjkunz 14*993229b6Sjkunz //! \exception elftosb::semantic_error Thrown if the source has multiple segments. getRangeForSegment(DataSource & source,DataSource::Segment & segment)15*993229b6SjkunzDataTarget::AddressRange ConstantDataTarget::getRangeForSegment(DataSource & source, DataSource::Segment & segment) 16*993229b6Sjkunz { 17*993229b6Sjkunz // can't handle multi-segment data sources 18*993229b6Sjkunz if (source.getSegmentCount() > 1) 19*993229b6Sjkunz { 20*993229b6Sjkunz throw semantic_error("constant targets only support single-segment sources"); 21*993229b6Sjkunz } 22*993229b6Sjkunz 23*993229b6Sjkunz // always relocate the segment to our begin address 24*993229b6Sjkunz AddressRange range; 25*993229b6Sjkunz range.m_begin = m_begin; 26*993229b6Sjkunz 27*993229b6Sjkunz if (isBounded()) 28*993229b6Sjkunz { 29*993229b6Sjkunz // we have an end address. trim the result range to the segment size 30*993229b6Sjkunz // or let the end address crop the segment. 31*993229b6Sjkunz range.m_end = std::min<uint32_t>(m_end, m_begin + segment.getLength()); 32*993229b6Sjkunz } 33*993229b6Sjkunz else 34*993229b6Sjkunz { 35*993229b6Sjkunz // we have no end address, so the segment size determines it. 36*993229b6Sjkunz range.m_end = m_begin + segment.getLength(); 37*993229b6Sjkunz } 38*993229b6Sjkunz 39*993229b6Sjkunz return range; 40*993229b6Sjkunz } 41*993229b6Sjkunz 42*993229b6Sjkunz //! If the \a segment has a natural location, the returned address range extends 43*993229b6Sjkunz //! from the segment's base address to its base address plus its length. 44*993229b6Sjkunz //! 45*993229b6Sjkunz //! \exception elftosb::semantic_error This exception is thrown if the \a segment 46*993229b6Sjkunz //! does not have a natural location associated with it. getRangeForSegment(DataSource & source,DataSource::Segment & segment)47*993229b6SjkunzDataTarget::AddressRange NaturalDataTarget::getRangeForSegment(DataSource & source, DataSource::Segment & segment) 48*993229b6Sjkunz { 49*993229b6Sjkunz if (!segment.hasNaturalLocation()) 50*993229b6Sjkunz { 51*993229b6Sjkunz throw semantic_error("source has no natural location"); 52*993229b6Sjkunz } 53*993229b6Sjkunz 54*993229b6Sjkunz AddressRange range; 55*993229b6Sjkunz range.m_begin = segment.getBaseAddress(); 56*993229b6Sjkunz range.m_end = segment.getBaseAddress() + segment.getLength(); 57*993229b6Sjkunz return range; 58*993229b6Sjkunz } 59*993229b6Sjkunz 60