From: Pedro Alves Date: Mon, 27 Dec 2010 19:53:55 +0000 (+0000) Subject: gdb/ X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac2abbb6366d8e89081ccf06ba5eb2ecbaccd679;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d8e3f42711d..dfb440db89f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-12-27 Pedro Alves + + * 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-23 Joel Brobecker * mi/mi-main.c (mi_cmd_remove_inferior): Use _() marker for error diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 484cc379111..9e1d6ee6fb3 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1138,6 +1138,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++)