diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/breakpoint.c | 58 | ||||
-rw-r--r-- | gdb/breakpoint.h | 9 | ||||
-rw-r--r-- | gdb/tui/tui-winsource.c | 2 |
4 files changed, 50 insertions, 34 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b52ef21..c3dd35e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,20 @@ 2007-09-22 Vladimir Prus <vladimir@codesourcery.com> + gdb/ + * breakpoint.h (struct breakpoint): Move the cond + field to... + (struct bp_location): Here. + * breakpoint.c (condition_command, bpstat_stop_status) + (print_one_breakpoint, allocate_bp_location) + (solib_load_unload_1, create_fork_vfork_event_catchpoint) + (create_exec_event_catchpoint, create_breakpoints) + (break_command_1, watch_command_1, handle_gnu_v3_exceptions) + (create_ada_exception_breakpoint, set_breakpoint_sal) + (delete_breakpoint, breakpoint_re_set_one): Adjust. + * tui/tui-winsource.c (tui_update_breakpoint_info): Adjust. + +2007-09-22 Vladimir Prus <vladimir@codesourcery.com> + Associate bp_stat with bp_location, not breakpoint. * breakpoint.h (breakpoint_at): Change type to bp_location*. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 92bbb02..333242a 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -569,17 +569,17 @@ condition_command (char *arg, int from_tty) ALL_BREAKPOINTS (b) if (b->number == bnum) { - if (b->cond) + struct bp_location *loc = b->loc; + if (loc->cond) { - xfree (b->cond); - b->cond = 0; + xfree (loc->cond); + loc->cond = 0; } if (b->cond_string != NULL) xfree (b->cond_string); if (*p == 0) { - b->cond = 0; b->cond_string = NULL; if (from_tty) printf_filtered (_("Breakpoint %d now unconditional.\n"), bnum); @@ -592,7 +592,8 @@ condition_command (char *arg, int from_tty) b->cond_string = savestring (arg, strlen (arg)); if (!b->pending) { - b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0); + b->loc->cond = parse_exp_1 (&arg, + block_for_pc (b->loc->address), 0); if (*arg) error (_("Junk at end of expression")); } @@ -2923,19 +2924,19 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid, int stopped_by_watchpoint) { int value_is_zero = 0; - if (b->cond) + if (b->loc->cond) { /* Need to select the frame, with all that implies so that the conditions will have the right context. */ select_frame (get_current_frame ()); value_is_zero - = catch_errors (breakpoint_cond_eval, (b->cond), + = catch_errors (breakpoint_cond_eval, (b->loc->cond), "Error in testing breakpoint condition:\n", RETURN_MASK_ALL); /* FIXME-someday, should give breakpoint # */ free_all_values (); } - if (b->cond && value_is_zero) + if (b->loc->cond && value_is_zero) { bs->stop = 0; /* Don't consider this a hit. */ @@ -3606,14 +3607,14 @@ print_one_breakpoint (struct breakpoint *b, ui_out_text (uiout, "\n"); } - if (b->cond && !ada_exception_catchpoint_p (b)) + if (b->loc->cond && !ada_exception_catchpoint_p (b)) { /* We do not print the condition for Ada exception catchpoints because the condition is an internal implementation detail that we do not want to expose to the user. */ annotate_field (7); ui_out_text (uiout, "\tstop only if "); - print_expression (b->cond, stb->stream); + print_expression (b->loc->cond, stb->stream); ui_out_field_stream (uiout, "cond", stb); ui_out_text (uiout, "\n"); } @@ -4085,6 +4086,7 @@ allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type) memset (loc, 0, sizeof (*loc)); loc->owner = bpt; + loc->cond = NULL; switch (bp_type) { @@ -4604,7 +4606,6 @@ solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname, b = set_raw_breakpoint (sals.sals[0], bp_kind); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = NULL; b->cond_string = (cond_string == NULL) ? NULL : savestring (cond_string, strlen (cond_string)); b->thread = thread; @@ -4661,7 +4662,6 @@ create_fork_vfork_event_catchpoint (int tempflag, char *cond_string, b = set_raw_breakpoint (sal, bp_kind); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = NULL; b->cond_string = (cond_string == NULL) ? NULL : savestring (cond_string, strlen (cond_string)); b->thread = thread; @@ -4700,7 +4700,6 @@ create_exec_event_catchpoint (int tempflag, char *cond_string) b = set_raw_breakpoint (sal, bp_catch_exec); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = NULL; b->cond_string = (cond_string == NULL) ? NULL : savestring (cond_string, strlen (cond_string)); b->thread = thread; @@ -5033,7 +5032,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string, b = set_raw_breakpoint (sal, type); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = cond[i]; + b->loc->cond = cond[i]; b->thread = thread; if (addr_string[i]) b->addr_string = addr_string[i]; @@ -5056,7 +5055,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string, { arg = pending_bp->cond_string; b->cond_string = savestring (arg, strlen (arg)); - b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0); + b->loc->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0); if (*arg) error (_("Junk at end of pending breakpoint condition expression")); } @@ -5399,7 +5398,7 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b : bp_breakpoint); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = *cond; + b->loc->cond = *cond; b->thread = thread; b->addr_string = *addr_string; b->cond_string = *cond_string; @@ -5792,7 +5791,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty) b->exp_valid_block = exp_valid_block; b->exp_string = savestring (exp_start, exp_end - exp_start); b->val = val; - b->cond = cond; + b->loc->cond = cond; if (cond_start) b->cond_string = savestring (cond_start, cond_end - cond_start); else @@ -6352,7 +6351,6 @@ create_exception_catchpoint (int tempflag, char *cond_string, b = set_raw_breakpoint (*sal, bptype); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = NULL; b->cond_string = (cond_string == NULL) ? NULL : savestring (cond_string, strlen (cond_string)); b->thread = thread; @@ -6432,7 +6430,6 @@ handle_gnu_v3_exceptions (int tempflag, char *cond_string, b = set_raw_breakpoint (sals.sals[0], bp_breakpoint); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = NULL; b->cond_string = (cond_string == NULL) ? NULL : savestring (cond_string, strlen (cond_string)); b->thread = -1; @@ -6519,7 +6516,7 @@ create_ada_exception_breakpoint (struct symtab_and_line sal, b->disposition = tempflag ? disp_del : disp_donttouch; b->number = breakpoint_count; b->ignore_count = 0; - b->cond = cond; + b->loc->cond = cond; b->addr_string = addr_string; b->language = language_ada; b->cond_string = cond_string; @@ -6701,7 +6698,6 @@ set_breakpoint_sal (struct symtab_and_line sal) b = set_raw_breakpoint (sal, bp_breakpoint); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; - b->cond = 0; b->thread = -1; return b; } @@ -7021,8 +7017,6 @@ delete_breakpoint (struct breakpoint *bpt) } free_command_lines (&bpt->commands); - if (bpt->cond) - xfree (bpt->cond); if (bpt->cond_string != NULL) xfree (bpt->cond_string); if (bpt->addr_string != NULL) @@ -7062,6 +7056,8 @@ delete_breakpoint (struct breakpoint *bpt) bp, we mark it as deleted before freeing its storage. */ bpt->type = bp_none; + if (bpt->loc->cond) + xfree (bpt->loc->cond); xfree (bpt->loc); xfree (bpt); } @@ -7215,14 +7211,14 @@ breakpoint_re_set_one (void *bint) if (b->cond_string != NULL) { s = b->cond_string; - if (b->cond) + if (b->loc->cond) { - xfree (b->cond); + xfree (b->loc->cond); /* Avoid re-freeing b->exp if an error during the call to parse_exp_1. */ - b->cond = NULL; + b->loc->cond = NULL; } - b->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0); + b->loc->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0); } /* We need to re-set the breakpoint if the address changes... */ @@ -7314,14 +7310,14 @@ breakpoint_re_set_one (void *bint) if (b->cond_string != NULL) { s = b->cond_string; - if (b->cond) + if (b->loc->cond) { - xfree (b->cond); + xfree (b->loc->cond); /* Avoid re-freeing b->exp if an error during the call to parse_exp_1. */ - b->cond = NULL; + b->loc->cond = NULL; } - b->cond = parse_exp_1 (&s, (struct block *) 0, 0); + b->loc->cond = parse_exp_1 (&s, (struct block *) 0, 0); } if (breakpoint_enabled (b)) mention (b); diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 7679cb0..dc36ac7 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -243,6 +243,13 @@ struct bp_location than reference counting. */ struct breakpoint *owner; + /* Conditional. Break only if this expression's value is nonzero. + Unlike string form of condition, which is associated with breakpoint, + this is associated with location, since if breakpoint has several + locations, the evaluation of expression can be different for + different locations. */ + struct expression *cond; + /* Nonzero if this breakpoint is now inserted. */ char inserted; @@ -341,8 +348,6 @@ struct breakpoint /* Stack depth (address of frame). If nonzero, break only if fp equals this. */ struct frame_id frame_id; - /* Conditional. Break only if this expression's value is nonzero. */ - struct expression *cond; /* String we used to set the breakpoint (malloc'd). */ char *addr_string; diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index ce8bedf..2b640e3 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -449,7 +449,7 @@ tui_update_breakpoint_info (struct tui_win_info *win, mode |= TUI_BP_ENABLED; if (bp->hit_count) mode |= TUI_BP_HIT; - if (bp->cond) + if (bp->loc->cond) mode |= TUI_BP_CONDITIONAL; if (bp->type == bp_hardware_breakpoint) mode |= TUI_BP_HARDWARE; |