1254721Semaste//===-- VMRange.h -----------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_VMRange_h_ 11254721Semaste#define liblldb_VMRange_h_ 12254721Semaste 13254721Semaste#include "lldb/lldb-private.h" 14254721Semaste#include <vector> 15254721Semaste 16254721Semastenamespace lldb_private { 17254721Semaste 18254721Semaste//---------------------------------------------------------------------- 19254721Semaste// A vm address range. These can represent offsets ranges or actual 20254721Semaste// addresses. 21254721Semaste//---------------------------------------------------------------------- 22254721Semasteclass VMRange 23254721Semaste{ 24254721Semastepublic: 25254721Semaste 26254721Semaste typedef std::vector<VMRange> collection; 27254721Semaste typedef collection::iterator iterator; 28254721Semaste typedef collection::const_iterator const_iterator; 29254721Semaste 30254721Semaste VMRange() : 31254721Semaste m_base_addr(0), 32254721Semaste m_byte_size(0) 33254721Semaste { 34254721Semaste } 35254721Semaste 36254721Semaste VMRange(lldb::addr_t start_addr, lldb::addr_t end_addr) : 37254721Semaste m_base_addr(start_addr), 38254721Semaste m_byte_size(end_addr > start_addr ? end_addr - start_addr : 0) 39254721Semaste { 40254721Semaste } 41254721Semaste 42254721Semaste ~VMRange() 43254721Semaste { 44254721Semaste } 45254721Semaste 46254721Semaste void 47254721Semaste Clear () 48254721Semaste { 49254721Semaste m_base_addr = 0; 50254721Semaste m_byte_size = 0; 51254721Semaste } 52254721Semaste 53254721Semaste // Set the start and end values 54254721Semaste void 55254721Semaste Reset (lldb::addr_t start_addr, lldb::addr_t end_addr) 56254721Semaste { 57254721Semaste SetBaseAddress (start_addr); 58254721Semaste SetEndAddress (end_addr); 59254721Semaste } 60254721Semaste 61254721Semaste // Set the start value for the range, and keep the same size 62254721Semaste void 63254721Semaste SetBaseAddress (lldb::addr_t base_addr) 64254721Semaste { 65254721Semaste m_base_addr = base_addr; 66254721Semaste } 67254721Semaste 68254721Semaste void 69254721Semaste SetEndAddress (lldb::addr_t end_addr) 70254721Semaste { 71254721Semaste const lldb::addr_t base_addr = GetBaseAddress(); 72254721Semaste if (end_addr > base_addr) 73254721Semaste m_byte_size = end_addr - base_addr; 74254721Semaste else 75254721Semaste m_byte_size = 0; 76254721Semaste } 77254721Semaste 78254721Semaste lldb::addr_t 79254721Semaste GetByteSize () const 80254721Semaste { 81254721Semaste return m_byte_size; 82254721Semaste } 83254721Semaste 84254721Semaste void 85254721Semaste SetByteSize (lldb::addr_t byte_size) 86254721Semaste { 87254721Semaste m_byte_size = byte_size; 88254721Semaste } 89254721Semaste 90254721Semaste lldb::addr_t 91254721Semaste GetBaseAddress () const 92254721Semaste { 93254721Semaste return m_base_addr; 94254721Semaste } 95254721Semaste 96254721Semaste lldb::addr_t 97254721Semaste GetEndAddress () const 98254721Semaste { 99254721Semaste return GetBaseAddress() + m_byte_size; 100254721Semaste } 101254721Semaste 102254721Semaste bool 103254721Semaste IsValid() const 104254721Semaste { 105254721Semaste return m_byte_size > 0; 106254721Semaste } 107254721Semaste 108254721Semaste bool 109254721Semaste Contains (lldb::addr_t addr) const 110254721Semaste { 111254721Semaste return (GetBaseAddress() <= addr) && (addr < GetEndAddress()); 112254721Semaste } 113254721Semaste 114254721Semaste bool 115254721Semaste Contains (const VMRange& range) const 116254721Semaste { 117254721Semaste if (Contains(range.GetBaseAddress())) 118254721Semaste { 119254721Semaste lldb::addr_t range_end = range.GetEndAddress(); 120254721Semaste return (GetBaseAddress() <= range_end) && (range_end <= GetEndAddress()); 121254721Semaste } 122254721Semaste return false; 123254721Semaste } 124254721Semaste 125254721Semaste void 126254721Semaste Dump (Stream *s, lldb::addr_t base_addr = 0, uint32_t addr_width = 8) const; 127254721Semaste 128254721Semaste class ValueInRangeUnaryPredicate 129254721Semaste { 130254721Semaste public: 131254721Semaste ValueInRangeUnaryPredicate(lldb::addr_t value) : 132254721Semaste _value(value) 133254721Semaste { 134254721Semaste } 135254721Semaste bool operator()(const VMRange& range) const 136254721Semaste { 137254721Semaste return range.Contains(_value); 138254721Semaste } 139254721Semaste lldb::addr_t _value; 140254721Semaste }; 141254721Semaste 142254721Semaste class RangeInRangeUnaryPredicate 143254721Semaste { 144254721Semaste public: 145254721Semaste RangeInRangeUnaryPredicate(VMRange range) : 146254721Semaste _range(range) 147254721Semaste { 148254721Semaste } 149254721Semaste bool operator()(const VMRange& range) const 150254721Semaste { 151254721Semaste return range.Contains(_range); 152254721Semaste } 153254721Semaste const VMRange& _range; 154254721Semaste }; 155254721Semaste 156254721Semaste static bool 157254721Semaste ContainsValue(const VMRange::collection& coll, lldb::addr_t value); 158254721Semaste 159254721Semaste static bool 160254721Semaste ContainsRange(const VMRange::collection& coll, const VMRange& range); 161254721Semaste 162254721Semaste // Returns a valid index into coll when a match is found, else UINT32_MAX 163254721Semaste // is returned 164254721Semaste static size_t 165254721Semaste FindRangeIndexThatContainsValue (const VMRange::collection& coll, lldb::addr_t value); 166254721Semaste 167254721Semasteprotected: 168254721Semaste lldb::addr_t m_base_addr; 169254721Semaste lldb::addr_t m_byte_size; 170254721Semaste}; 171254721Semaste 172254721Semastebool operator== (const VMRange& lhs, const VMRange& rhs); 173254721Semastebool operator!= (const VMRange& lhs, const VMRange& rhs); 174254721Semastebool operator< (const VMRange& lhs, const VMRange& rhs); 175254721Semastebool operator<= (const VMRange& lhs, const VMRange& rhs); 176254721Semastebool operator> (const VMRange& lhs, const VMRange& rhs); 177254721Semastebool operator>= (const VMRange& lhs, const VMRange& rhs); 178254721Semaste 179254721Semaste} // namespace lldb_private 180254721Semaste 181254721Semaste#endif // liblldb_VMRange_h_ 182