/** Returns a list of parts of a single section that have been referenced. The offsets are relative to the start of the * section. */ ExtentMap SgAsmGenericSection::get_referenced_extents() const { ExtentMap retval; if (0==get_size()) return retval; Extent s(get_offset(), get_size()); const ExtentMap &file_extents = get_file()->get_referenced_extents(); for (ExtentMap::const_iterator i=file_extents.begin(); i!=file_extents.end(); i++) { Extent e = i->first; if (e.contained_in(s)) { retval.insert(Extent(e.first()-get_offset(), e.size())); } else if (e.left_of(s) || e.right_of(s)) { /*void*/ } else if (e.contains(s)) { retval.insert(Extent(0, get_size())); } else if (e.begins_before(s)) { retval.insert(Extent(0, e.first()+e.size()-get_offset())); } else if (e.ends_after(s)) { retval.insert(Extent(e.first()-get_offset(), get_offset()+get_size()-e.first())); } else { assert(!"invalid extent overlap category"); abort(); } } return retval; }
Sawyer::Optional<rose_addr_t> MemoryMap::findAny(const Extent &limits, const std::vector<uint8_t> &bytesToFind, unsigned requiredPerms, unsigned prohibitedPerms) const { if (limits.empty() || bytesToFind.empty()) return Sawyer::Nothing(); AddressInterval interval = AddressInterval::hull(limits.first(), limits.last()); return findAny(interval, bytesToFind, requiredPerms, prohibitedPerms); }
/** Write just the specified regions back to the file */ void SgAsmGenericSection::unparse(std::ostream &f, const ExtentMap &map) const { for (ExtentMap::const_iterator i=map.begin(); i!=map.end(); ++i) { Extent e = i->first; assert(e.first()+e.size() <= get_size()); const unsigned char *extent_data; if (e.first() >= p_data.size()) { extent_data = NULL; } else if (e.first() + e.size() > p_data.size()) { extent_data = &p_data[e.first()]; } else { extent_data = &p_data[e.first()]; } if (extent_data) write(f, e.first(), e.size(), extent_data); } }
AddressInterval toAddressInterval(const Extent &x) { return x.empty() ? AddressInterval() : AddressInterval::hull(x.first(), x.last()); }