gdb/
authorPedro Alves <palves@redhat.com>
Mon, 27 Dec 2010 19:37:04 +0000 (19:37 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 27 Dec 2010 19:37:04 +0000 (19:37 +0000)
* breakpoint.c (breakpoint_restore_shadows): When looking for the
location with the lowest address that overlaps the memory range we
want to restore shadows for, account for multiple locations at the
same address.

gdb/ChangeLog
gdb/breakpoint.c

index 51be0d254d3b279ebd17f376e32e1df45a77f531..fa158c00823e8434a8384d721458cce149448c92 100644 (file)
@@ -1,3 +1,11 @@
+2010-12-27  Pedro Alves  <pedro@codesourcery.com>
+
+       gdb/
+       * breakpoint.c (breakpoint_restore_shadows): When looking for the
+       location with the lowest address that overlaps the memory range we
+       want to restore shadows for, account for multiple locations at the
+       same address.
+
 2010-12-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Code cleanup - renaming.
index 5736fbc0b63f5ba207d2a0e20cbe6e84fe561535..9835ad9bb940c085368de32aa05a052b0b5c09f8 100644 (file)
@@ -1130,6 +1130,23 @@ breakpoint_restore_shadows (gdb_byte *buf, ULONGEST memaddr, LONGEST len)
        bc_r = bc;
     }
 
+  /* Due to the binary search above, we need to make sure we pick the
+     first location that's at BC_L's address.  E.g., if there are
+     multiple locations at the same address, BC_L may end up pointing
+     at a duplicate location, and miss the "master"/"inserted"
+     location.  Say, given locations L1, L2 and L3 at addresses A and
+     B:
+
+      L1@A, L2@A, L3@B, ...
+
+     BC_L could end up pointing at location L2, while the "master"
+     location could be L1.  Since the `loc->inserted' flag is only set
+     on "master" locations, we'd forget to restore the shadow of L1
+     and L2.  */
+  while (bc_l > 0
+        && bp_location[bc_l]->address == bp_location[bc_l - 1]->address)
+    bc_l--;
+
   /* Now do full processing of the found relevant range of elements.  */
 
   for (bc = bc_l; bc < bp_location_count; bc++)