VMRange.h revision 36da2aa6dc5ad9994b638ed09eb81c44cc05540b
1//===-- VMRange.h -----------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_VMRange_h_ 11#define liblldb_VMRange_h_ 12 13#include "lldb/lldb-private.h" 14#include <vector> 15 16namespace lldb_private { 17 18//---------------------------------------------------------------------- 19// A vm address range. These can represent offsets ranges or actual 20// addresses. 21//---------------------------------------------------------------------- 22class VMRange 23{ 24public: 25 26 typedef std::vector<VMRange> collection; 27 typedef collection::iterator iterator; 28 typedef collection::const_iterator const_iterator; 29 30 VMRange() : 31 m_base_addr(0), 32 m_byte_size(0) 33 { 34 } 35 36 VMRange(lldb::addr_t start_addr, lldb::addr_t end_addr) : 37 m_base_addr(start_addr), 38 m_byte_size(end_addr > start_addr ? end_addr - start_addr : 0) 39 { 40 } 41 42 ~VMRange() 43 { 44 } 45 46 void 47 Clear () 48 { 49 m_base_addr = 0; 50 m_byte_size = 0; 51 } 52 53 // Set the start and end values 54 void 55 Reset (lldb::addr_t start_addr, lldb::addr_t end_addr) 56 { 57 SetBaseAddress (start_addr); 58 SetEndAddress (end_addr); 59 } 60 61 // Set the start value for the range, and keep the same size 62 void 63 SetBaseAddress (lldb::addr_t base_addr) 64 { 65 m_base_addr = base_addr; 66 } 67 68 void 69 SetEndAddress (lldb::addr_t end_addr) 70 { 71 const lldb::addr_t base_addr = GetBaseAddress(); 72 if (end_addr > base_addr) 73 m_byte_size = end_addr - base_addr; 74 else 75 m_byte_size = 0; 76 } 77 78 lldb::addr_t 79 GetByteSize () const 80 { 81 return m_byte_size; 82 } 83 84 void 85 SetByteSize (lldb::addr_t byte_size) 86 { 87 m_byte_size = byte_size; 88 } 89 90 lldb::addr_t 91 GetBaseAddress () const 92 { 93 return m_base_addr; 94 } 95 96 lldb::addr_t 97 GetEndAddress () const 98 { 99 return GetBaseAddress() + m_byte_size; 100 } 101 102 bool 103 IsValid() const 104 { 105 return m_byte_size > 0; 106 } 107 108 bool 109 Contains (lldb::addr_t addr) const 110 { 111 return (GetBaseAddress() <= addr) && (addr < GetEndAddress()); 112 } 113 114 bool 115 Contains (const VMRange& range) const 116 { 117 if (Contains(range.GetBaseAddress())) 118 { 119 lldb::addr_t range_end = range.GetEndAddress(); 120 return (GetBaseAddress() <= range_end) && (range_end <= GetEndAddress()); 121 } 122 return false; 123 } 124 125 void 126 Dump (Stream *s, lldb::addr_t base_addr = 0, uint32_t addr_width = 8) const; 127 128 class ValueInRangeUnaryPredicate 129 { 130 public: 131 ValueInRangeUnaryPredicate(lldb::addr_t value) : 132 _value(value) 133 { 134 } 135 bool operator()(const VMRange& range) const 136 { 137 return range.Contains(_value); 138 } 139 lldb::addr_t _value; 140 }; 141 142 class RangeInRangeUnaryPredicate 143 { 144 public: 145 RangeInRangeUnaryPredicate(VMRange range) : 146 _range(range) 147 { 148 } 149 bool operator()(const VMRange& range) const 150 { 151 return range.Contains(_range); 152 } 153 const VMRange& _range; 154 }; 155 156 static bool 157 ContainsValue(const VMRange::collection& coll, lldb::addr_t value); 158 159 static bool 160 ContainsRange(const VMRange::collection& coll, const VMRange& range); 161 162 // Returns a valid index into coll when a match is found, else UINT32_MAX 163 // is returned 164 static size_t 165 FindRangeIndexThatContainsValue (const VMRange::collection& coll, lldb::addr_t value); 166 167protected: 168 lldb::addr_t m_base_addr; 169 lldb::addr_t m_byte_size; 170}; 171 172bool operator== (const VMRange& lhs, const VMRange& rhs); 173bool operator!= (const VMRange& lhs, const VMRange& rhs); 174bool operator< (const VMRange& lhs, const VMRange& rhs); 175bool operator<= (const VMRange& lhs, const VMRange& rhs); 176bool operator> (const VMRange& lhs, const VMRange& rhs); 177bool operator>= (const VMRange& lhs, const VMRange& rhs); 178 179} // namespace lldb_private 180 181#endif // liblldb_VMRange_h_ 182