Automatic date update in version.in
[platform/upstream/binutils.git] / gdb / memrange.c
index 4ffe6bd..485550b 100644 (file)
@@ -1,6 +1,6 @@
 /* Memory ranges
 
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -31,7 +31,17 @@ mem_ranges_overlap (CORE_ADDR start1, int len1,
   return (l < h);
 }
 
-/* qsort comparison function, that compares mem_ranges.  */
+/* See memrange.h.  */
+
+int
+address_in_mem_range (CORE_ADDR address, const struct mem_range *r)
+{
+  return (r->start <= address
+         && (address - r->start) < r->length);
+}
+
+/* qsort comparison function, that compares mem_ranges.  Ranges are
+   sorted in ascending START order.  */
 
 static int
 compare_mem_ranges (const void *ap, const void *bp)
@@ -50,6 +60,10 @@ compare_mem_ranges (const void *ap, const void *bp)
 void
 normalize_mem_ranges (VEC(mem_range_s) *ranges)
 {
+  /* This function must not use any VEC operation on RANGES that
+     reallocates the memory block as that invalidates the RANGES
+     pointer, which callers expect to remain valid.  */
+
   if (!VEC_empty (mem_range_s, ranges))
     {
       struct mem_range *ra, *rb;
@@ -68,7 +82,8 @@ normalize_mem_ranges (VEC(mem_range_s) *ranges)
             merge them.  */
          if (rb->start <= ra->start + ra->length)
            {
-             ra->length = (rb->start + rb->length) - ra->start;
+             ra->length = max (ra->length,
+                               (rb->start - ra->start) + rb->length);
              continue;         /* next b, same a */
            }
          a++;                  /* next a */