* breakpoint.c (update_global_location_list): Fix duplicate

locations detection.
This commit is contained in:
Pedro Alves 2009-11-20 14:51:47 +00:00
parent db82e815be
commit c7d46a38b6
2 changed files with 37 additions and 19 deletions

View file

@ -1,3 +1,8 @@
2009-11-20 Pedro Alves <pedro@codesourcery.com>
* breakpoint.c (update_global_location_list): Fix duplicate
locations detection.
2009-11-20 Pedro Alves <pedro@codesourcery.com> 2009-11-20 Pedro Alves <pedro@codesourcery.com>
* infrun.c (handle_inferior_event): Hardware hatchpoint traps are * infrun.c (handle_inferior_event): Hardware hatchpoint traps are

View file

@ -8214,10 +8214,11 @@ update_global_location_list (int should_insert)
old_locp++) old_locp++)
{ {
struct bp_location *old_loc = *old_locp; struct bp_location *old_loc = *old_locp;
struct bp_location **loc2p;
/* Tells if 'old_loc' is found amoung the new locations. If not, we /* Tells if 'old_loc' is found amoung the new locations. If not, we
have to free it. */ have to free it. */
int found_object; int found_object = 0;
/* Tells if the location should remain inserted in the target. */ /* Tells if the location should remain inserted in the target. */
int keep_in_target = 0; int keep_in_target = 0;
int removed = 0; int removed = 0;
@ -8225,9 +8226,20 @@ update_global_location_list (int should_insert)
/* Skip LOCP entries which will definitely never be needed. Stop either /* Skip LOCP entries which will definitely never be needed. Stop either
at or being the one matching OLD_LOC. */ at or being the one matching OLD_LOC. */
while (locp < bp_location + bp_location_count while (locp < bp_location + bp_location_count
&& bp_location_compare (*locp, old_loc) < 0) && (*locp)->address < old_loc->address)
locp++; locp++;
found_object = locp < bp_location + bp_location_count && *locp == old_loc;
for (loc2p = locp;
(loc2p < bp_location + bp_location_count
&& (*loc2p)->address == old_loc->address);
loc2p++)
{
if (*loc2p == old_loc)
{
found_object = 1;
break;
}
}
/* If this location is no longer present, and inserted, look if there's /* If this location is no longer present, and inserted, look if there's
maybe a new location at the same address. If so, mark that one maybe a new location at the same address. If so, mark that one
@ -8253,27 +8265,28 @@ update_global_location_list (int should_insert)
if (breakpoint_address_is_meaningful (old_loc->owner)) if (breakpoint_address_is_meaningful (old_loc->owner))
{ {
struct bp_location **loc2p;
for (loc2p = locp; for (loc2p = locp;
loc2p < bp_location + bp_location_count (loc2p < bp_location + bp_location_count
&& breakpoint_address_match ((*loc2p)->pspace->aspace, && (*loc2p)->address == old_loc->address);
(*loc2p)->address,
old_loc->pspace->aspace,
old_loc->address);
loc2p++) loc2p++)
{ {
struct bp_location *loc2 = *loc2p; struct bp_location *loc2 = *loc2p;
/* For the sake of should_be_inserted. if (breakpoint_address_match (loc2->pspace->aspace,
Duplicates check below will fix up this later. */ loc2->address,
loc2->duplicate = 0; old_loc->pspace->aspace,
if (loc2 != old_loc && should_be_inserted (loc2)) old_loc->address))
{ {
loc2->inserted = 1; /* For the sake of should_be_inserted.
loc2->target_info = old_loc->target_info; Duplicates check below will fix up this later. */
keep_in_target = 1; loc2->duplicate = 0;
break; if (loc2 != old_loc && should_be_inserted (loc2))
{
loc2->inserted = 1;
loc2->target_info = old_loc->target_info;
keep_in_target = 1;
break;
}
} }
} }
} }