aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Utility/VMRange.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/Utility/VMRange.h')
-rw-r--r--include/lldb/Utility/VMRange.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/include/lldb/Utility/VMRange.h b/include/lldb/Utility/VMRange.h
new file mode 100644
index 000000000000..98362f4d7608
--- /dev/null
+++ b/include/lldb/Utility/VMRange.h
@@ -0,0 +1,133 @@
+//===-- VMRange.h -----------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_VMRange_h_
+#define liblldb_VMRange_h_
+
+#include "lldb/lldb-types.h" // for addr_t
+
+#include <stddef.h> // for size_t
+#include <stdint.h> // for uint32_t
+#include <vector>
+
+namespace lldb_private {
+class Stream;
+}
+
+namespace lldb_private {
+
+//----------------------------------------------------------------------
+// A vm address range. These can represent offsets ranges or actual
+// addresses.
+//----------------------------------------------------------------------
+class VMRange {
+public:
+ typedef std::vector<VMRange> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
+
+ VMRange() : m_base_addr(0), m_byte_size(0) {}
+
+ VMRange(lldb::addr_t start_addr, lldb::addr_t end_addr)
+ : m_base_addr(start_addr),
+ m_byte_size(end_addr > start_addr ? end_addr - start_addr : 0) {}
+
+ ~VMRange() {}
+
+ void Clear() {
+ m_base_addr = 0;
+ m_byte_size = 0;
+ }
+
+ // Set the start and end values
+ void Reset(lldb::addr_t start_addr, lldb::addr_t end_addr) {
+ SetBaseAddress(start_addr);
+ SetEndAddress(end_addr);
+ }
+
+ // Set the start value for the range, and keep the same size
+ void SetBaseAddress(lldb::addr_t base_addr) { m_base_addr = base_addr; }
+
+ void SetEndAddress(lldb::addr_t end_addr) {
+ const lldb::addr_t base_addr = GetBaseAddress();
+ if (end_addr > base_addr)
+ m_byte_size = end_addr - base_addr;
+ else
+ m_byte_size = 0;
+ }
+
+ lldb::addr_t GetByteSize() const { return m_byte_size; }
+
+ void SetByteSize(lldb::addr_t byte_size) { m_byte_size = byte_size; }
+
+ lldb::addr_t GetBaseAddress() const { return m_base_addr; }
+
+ lldb::addr_t GetEndAddress() const { return GetBaseAddress() + m_byte_size; }
+
+ bool IsValid() const { return m_byte_size > 0; }
+
+ bool Contains(lldb::addr_t addr) const {
+ return (GetBaseAddress() <= addr) && (addr < GetEndAddress());
+ }
+
+ bool Contains(const VMRange &range) const {
+ if (Contains(range.GetBaseAddress())) {
+ lldb::addr_t range_end = range.GetEndAddress();
+ return (GetBaseAddress() <= range_end) && (range_end <= GetEndAddress());
+ }
+ return false;
+ }
+
+ void Dump(Stream *s, lldb::addr_t base_addr = 0,
+ uint32_t addr_width = 8) const;
+
+ class ValueInRangeUnaryPredicate {
+ public:
+ ValueInRangeUnaryPredicate(lldb::addr_t value) : _value(value) {}
+ bool operator()(const VMRange &range) const {
+ return range.Contains(_value);
+ }
+ lldb::addr_t _value;
+ };
+
+ class RangeInRangeUnaryPredicate {
+ public:
+ RangeInRangeUnaryPredicate(VMRange range) : _range(range) {}
+ bool operator()(const VMRange &range) const {
+ return range.Contains(_range);
+ }
+ const VMRange &_range;
+ };
+
+ static bool ContainsValue(const VMRange::collection &coll,
+ lldb::addr_t value);
+
+ static bool ContainsRange(const VMRange::collection &coll,
+ const VMRange &range);
+
+ // Returns a valid index into coll when a match is found, else UINT32_MAX
+ // is returned
+ static size_t FindRangeIndexThatContainsValue(const VMRange::collection &coll,
+ lldb::addr_t value);
+
+protected:
+ lldb::addr_t m_base_addr;
+ lldb::addr_t m_byte_size;
+};
+
+bool operator==(const VMRange &lhs, const VMRange &rhs);
+bool operator!=(const VMRange &lhs, const VMRange &rhs);
+bool operator<(const VMRange &lhs, const VMRange &rhs);
+bool operator<=(const VMRange &lhs, const VMRange &rhs);
+bool operator>(const VMRange &lhs, const VMRange &rhs);
+bool operator>=(const VMRange &lhs, const VMRange &rhs);
+
+} // namespace lldb_private
+
+#endif // liblldb_VMRange_h_