2015-06-16 Luis Machado * breakpoint.c (make_breakpoint_permanent): Expand comment. Don't mark permanent locations as inserted. (add_location_to_breakpoint): Likewise (update_global_location_list): Don't error out if a permanent breakpoint is not marked inserted. Don't error out if a non-permanent breakpoint location is inserted on top of a permanent breakpoint. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index eb3df02..768ce59 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -7440,15 +7440,16 @@ make_breakpoint_permanent (struct breakpoint *b) struct bp_location *bl; /* By definition, permanent breakpoints are already present in the - code. Mark all locations as inserted. For now, - make_breakpoint_permanent is called in just one place, so it's - hard to say if it's reasonable to have permanent breakpoint with - multiple locations or not, but it's easy to implement. */ + code. For now, make_breakpoint_permanent is called in just one place, so + it's hard to say if it's reasonable to have permanent breakpoint with + multiple locations or not, but it's easy to implement. + + Permanent breakpoints are not marked as inserted so we allow other + non-permanent locations at the same address to be inserted on top + of it. This is required due to some targets, simulators mostly, not + dealing properly with hardwired breakpoints in the code. */ for (bl = b->loc; bl; bl = bl->next) - { - bl->permanent = 1; - bl->inserted = 1; - } + bl->permanent = 1; } /* Call this routine when stepping and nexting to enable a breakpoint @@ -8918,11 +8919,10 @@ add_location_to_breakpoint (struct breakpoint *b, set_breakpoint_location_function (loc, sal->explicit_pc || sal->explicit_line); + /* See comment in make_breakpoint_permanent for the reason why we don't mark + permanent breakpoints as always inserted. */ if (bp_loc_is_permanent (loc)) - { - loc->inserted = 1; - loc->permanent = 1; - } + loc->permanent = 1; return loc; } @@ -12438,12 +12438,6 @@ update_global_location_list (enum ugll_insert_mode insert_mode) continue; } - /* Permanent breakpoint should always be inserted. */ - if (loc->permanent && ! loc->inserted) - internal_error (__FILE__, __LINE__, - _("allegedly permanent breakpoint is not " - "actually inserted")); - if (b->type == bp_hardware_watchpoint) loc_first_p = &wp_loc_first; else if (b->type == bp_read_watchpoint) @@ -12479,12 +12473,6 @@ update_global_location_list (enum ugll_insert_mode insert_mode) /* Clear the condition modification flag. */ loc->condition_changed = condition_unchanged; - - if (loc->inserted && !loc->permanent - && (*loc_first_p)->permanent) - internal_error (__FILE__, __LINE__, - _("another breakpoint was inserted on top of " - "a permanent breakpoint")); } if (insert_mode == UGLL_INSERT || breakpoints_should_be_inserted_now ())