1a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org//===-- VMRange.cpp ---------------------------------------------*- C++ -*-===//
2ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//
3ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//                     The LLVM Compiler Infrastructure
4ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//
5ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// This file is distributed under the University of Illinois Open Source
6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// License. See LICENSE.TXT for details.
7ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//
8ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//===----------------------------------------------------------------------===//
9ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
10ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "lldb/lldb-private.h"
11ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
12ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "lldb/Core/Stream.h"
13ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "lldb/Core/VMRange.h"
14ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include <algorithm>
15ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
16ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgusing namespace lldb;
17ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgusing namespace lldb_private;
18ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
19ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
20ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgVMRange::ContainsValue(const VMRange::collection& coll, lldb::addr_t value)
21ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
22ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ValueInRangeUnaryPredicate in_range_predicate(value);
23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator pos;
24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator end = coll.end();
25ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    pos = std::find_if( coll.begin(), end, in_range_predicate );
26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (pos != end)
27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return false;
29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
31ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgVMRange::ContainsRange(const VMRange::collection& coll, const VMRange& range)
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    RangeInRangeUnaryPredicate in_range_predicate(range);
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator pos;
36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator end = coll.end();
37ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    pos = std::find_if( coll.begin(), end, in_range_predicate );
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (pos != end)
39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return false;
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgsize_t
44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgVMRange::FindRangeIndexThatContainsValue (const VMRange::collection& coll, lldb::addr_t value)
45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ValueInRangeUnaryPredicate in_range_predicate(value);
47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator begin = coll.begin();
48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator end = coll.end();
49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    VMRange::const_iterator pos = std::find_if (begin, end, in_range_predicate);
50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (pos != end)
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return std::distance (begin, pos);
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return UINT32_MAX;
53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
54ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
55ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid
56ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgVMRange::Dump(Stream *s, lldb::addr_t offset, uint32_t addr_width) const
57ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
58ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    s->AddressRange(offset + GetBaseAddress(), offset + GetEndAddress(), addr_width);
59ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
60ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
61ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orglldb_private::operator== (const VMRange& lhs, const VMRange& rhs)
63ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
64ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return lhs.GetBaseAddress() == rhs.GetBaseAddress() && lhs.GetEndAddress() == rhs.GetEndAddress();
65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
67ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
68ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orglldb_private::operator!= (const VMRange& lhs, const VMRange& rhs)
69c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{
70ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return lhs.GetBaseAddress() != rhs.GetBaseAddress() || lhs.GetEndAddress() != rhs.GetEndAddress();
71ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
72ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
73a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgbool
74ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orglldb_private::operator< (const VMRange& lhs, const VMRange& rhs)
75ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (lhs.GetBaseAddress() < rhs.GetBaseAddress())
77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
78ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    else if (lhs.GetBaseAddress() > rhs.GetBaseAddress())
79ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return false;
80ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return lhs.GetEndAddress() < rhs.GetEndAddress();
81ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
82ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
83ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orglldb_private::operator<= (const VMRange& lhs, const VMRange& rhs)
85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
86ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (lhs.GetBaseAddress() < rhs.GetBaseAddress())
87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
88ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    else if (lhs.GetBaseAddress() > rhs.GetBaseAddress())
89ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return false;
90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return lhs.GetEndAddress() <= rhs.GetEndAddress();
91ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
92ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orglldb_private::operator> (const VMRange& lhs, const VMRange& rhs)
957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org{
96ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (lhs.GetBaseAddress() > rhs.GetBaseAddress())
97ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
98ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    else if (lhs.GetBaseAddress() < rhs.GetBaseAddress())
99ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return false;
1007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    return lhs.GetEndAddress() > rhs.GetEndAddress();
101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
103ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool
104ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orglldb_private::operator>= (const VMRange& lhs, const VMRange& rhs)
105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
106ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (lhs.GetBaseAddress() > rhs.GetBaseAddress())
107ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return true;
108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    else if (lhs.GetBaseAddress() < rhs.GetBaseAddress())
109ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return false;
110ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return lhs.GetEndAddress() >= rhs.GetEndAddress();
111ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org