GDB (xrefs)
/tmp/gdb-8.1/gdb/memrange.c
Go to the documentation of this file.
1 /* Memory ranges
2 
3  Copyright (C) 2010-2018 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "memrange.h"
22 #include <algorithm>
23 
24 int
25 mem_ranges_overlap (CORE_ADDR start1, int len1,
26  CORE_ADDR start2, int len2)
27 {
28  ULONGEST h, l;
29 
30  l = std::max (start1, start2);
31  h = std::min (start1 + len1, start2 + len2);
32  return (l < h);
33 }
34 
35 /* See memrange.h. */
36 
37 int
38 address_in_mem_range (CORE_ADDR address, const struct mem_range *r)
39 {
40  return (r->start <= address
41  && (address - r->start) < r->length);
42 }
43 
44 void
45 normalize_mem_ranges (std::vector<mem_range> *memory)
46 {
47  /* This function must not use any VEC operation on RANGES that
48  reallocates the memory block as that invalidates the RANGES
49  pointer, which callers expect to remain valid. */
50 
51  if (!memory->empty ())
52  {
53  std::vector<mem_range> &m = *memory;
54 
55  std::sort (m.begin (), m.end ());
56 
57  int a = 0;
58  for (int b = 1; b < m.size (); b++)
59  {
60  /* If mem_range B overlaps or is adjacent to mem_range A,
61  merge them. */
62  if (m[b].start <= m[a].start + m[a].length)
63  {
64  m[a].length = std::max ((CORE_ADDR) m[a].length,
65  (m[b].start - m[a].start) + m[b].length);
66  continue; /* next b, same a */
67  }
68  a++; /* next a */
69 
70  if (a != b)
71  m[a] = m[b];
72  }
73 
74  m.resize (a + 1);
75  }
76 }
bfd_vma CORE_ADDR
Definition: common-types.h:41
int mem_ranges_overlap(CORE_ADDR start1, int len1, CORE_ADDR start2, int len2)
Definition: memrange.c:25
void normalize_mem_ranges(std::vector< mem_range > *memory)
Definition: memrange.c:45
int address_in_mem_range(CORE_ADDR address, const struct mem_range *r)
Definition: memrange.c:38
unsigned long long ULONGEST
Definition: common-types.h:53
int length
Definition: memrange.h:50
CORE_ADDR start
Definition: memrange.h:47