* breakpoint.c (breakpoint_re_set_one): Factor out breakpoint-resetting
code from here ... (re_set_breakpoint): ... to here ... (addr_string_to_sals): ... and here.
This commit is contained in:
parent
991cda6c97
commit
ef23e70580
2 changed files with 125 additions and 92 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2011-03-30 Thiago Jung Bauermann <bauerman@br.ibm.com>
|
||||||
|
|
||||||
|
* breakpoint.c (breakpoint_re_set_one): Factor out breakpoint-resetting
|
||||||
|
code from here ...
|
||||||
|
(re_set_breakpoint): ... to here ...
|
||||||
|
(addr_string_to_sals): ... and here.
|
||||||
|
|
||||||
2011-03-29 Pierre Muller <muller@ics.u-strasbg.fr>
|
2011-03-29 Pierre Muller <muller@ics.u-strasbg.fr>
|
||||||
|
|
||||||
* Makefile.in (SFILES): Add missing C sources.
|
* Makefile.in (SFILES): Add missing C sources.
|
||||||
|
|
210
gdb/breakpoint.c
210
gdb/breakpoint.c
|
@ -10576,6 +10576,123 @@ update_breakpoint_locations (struct breakpoint *b,
|
||||||
update_global_location_list (1);
|
update_global_location_list (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find the SaL locations corresponding to the given ADDR_STRING.
|
||||||
|
On return, FOUND will be 1 if any SaL was found, zero otherwise. */
|
||||||
|
|
||||||
|
static struct symtabs_and_lines
|
||||||
|
addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
int marker_spec, not_found;
|
||||||
|
struct symtabs_and_lines sals;
|
||||||
|
struct gdb_exception e;
|
||||||
|
|
||||||
|
s = addr_string;
|
||||||
|
marker_spec = b->type == bp_static_tracepoint && is_marker_spec (s);
|
||||||
|
|
||||||
|
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||||
|
{
|
||||||
|
if (marker_spec)
|
||||||
|
{
|
||||||
|
sals = decode_static_tracepoint_spec (&s);
|
||||||
|
if (sals.nelts > b->static_trace_marker_id_idx)
|
||||||
|
{
|
||||||
|
sals.sals[0] = sals.sals[b->static_trace_marker_id_idx];
|
||||||
|
sals.nelts = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error (_("marker %s not found"), b->static_trace_marker_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0,
|
||||||
|
NULL, ¬_found);
|
||||||
|
}
|
||||||
|
if (e.reason < 0)
|
||||||
|
{
|
||||||
|
int not_found_and_ok = 0;
|
||||||
|
/* For pending breakpoints, it's expected that parsing will
|
||||||
|
fail until the right shared library is loaded. User has
|
||||||
|
already told to create pending breakpoints and don't need
|
||||||
|
extra messages. If breakpoint is in bp_shlib_disabled
|
||||||
|
state, then user already saw the message about that
|
||||||
|
breakpoint being disabled, and don't want to see more
|
||||||
|
errors. */
|
||||||
|
if (not_found
|
||||||
|
&& (b->condition_not_parsed
|
||||||
|
|| (b->loc && b->loc->shlib_disabled)
|
||||||
|
|| b->enable_state == bp_disabled))
|
||||||
|
not_found_and_ok = 1;
|
||||||
|
|
||||||
|
if (!not_found_and_ok)
|
||||||
|
{
|
||||||
|
/* We surely don't want to warn about the same breakpoint
|
||||||
|
10 times. One solution, implemented here, is disable
|
||||||
|
the breakpoint on error. Another solution would be to
|
||||||
|
have separate 'warning emitted' flag. Since this
|
||||||
|
happens only when a binary has changed, I don't know
|
||||||
|
which approach is better. */
|
||||||
|
b->enable_state = bp_disabled;
|
||||||
|
throw_exception (e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!not_found)
|
||||||
|
{
|
||||||
|
gdb_assert (sals.nelts == 1);
|
||||||
|
|
||||||
|
resolve_sal_pc (&sals.sals[0]);
|
||||||
|
if (b->condition_not_parsed && s && s[0])
|
||||||
|
{
|
||||||
|
char *cond_string = 0;
|
||||||
|
int thread = -1;
|
||||||
|
int task = 0;
|
||||||
|
|
||||||
|
find_condition_and_thread (s, sals.sals[0].pc,
|
||||||
|
&cond_string, &thread, &task);
|
||||||
|
if (cond_string)
|
||||||
|
b->cond_string = cond_string;
|
||||||
|
b->thread = thread;
|
||||||
|
b->task = task;
|
||||||
|
b->condition_not_parsed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b->type == bp_static_tracepoint && !marker_spec)
|
||||||
|
sals.sals[0] = update_static_tracepoint (b, sals.sals[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
*found = !not_found;
|
||||||
|
|
||||||
|
return sals;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reevaluate a hardware or software breakpoint and recreate its locations.
|
||||||
|
This is necessary after symbols are read (e.g., an executable or DSO
|
||||||
|
was loaded, or the inferior just started). */
|
||||||
|
|
||||||
|
static void
|
||||||
|
re_set_breakpoint (struct breakpoint *b)
|
||||||
|
{
|
||||||
|
int found;
|
||||||
|
struct symtabs_and_lines sals;
|
||||||
|
struct symtabs_and_lines expanded = {0};
|
||||||
|
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
|
||||||
|
|
||||||
|
input_radix = b->input_radix;
|
||||||
|
save_current_space_and_thread ();
|
||||||
|
switch_to_program_space_and_thread (b->pspace);
|
||||||
|
set_language (b->language);
|
||||||
|
|
||||||
|
sals = addr_string_to_sals (b, b->addr_string, &found);
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
make_cleanup (xfree, sals.sals);
|
||||||
|
expanded = expand_line_sal_maybe (sals.sals[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_breakpoint_locations (b, expanded);
|
||||||
|
do_cleanups (cleanups);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset a breakpoint given it's struct breakpoint * BINT.
|
/* Reset a breakpoint given it's struct breakpoint * BINT.
|
||||||
The value we return ends up being the return value from catch_errors.
|
The value we return ends up being the return value from catch_errors.
|
||||||
Unused in this case. */
|
Unused in this case. */
|
||||||
|
@ -10585,14 +10702,6 @@ breakpoint_re_set_one (void *bint)
|
||||||
{
|
{
|
||||||
/* Get past catch_errs. */
|
/* Get past catch_errs. */
|
||||||
struct breakpoint *b = (struct breakpoint *) bint;
|
struct breakpoint *b = (struct breakpoint *) bint;
|
||||||
int not_found = 0;
|
|
||||||
int *not_found_ptr = ¬_found;
|
|
||||||
struct symtabs_and_lines sals = {0};
|
|
||||||
struct symtabs_and_lines expanded = {0};
|
|
||||||
char *s;
|
|
||||||
struct gdb_exception e;
|
|
||||||
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
|
|
||||||
int marker_spec = 0;
|
|
||||||
|
|
||||||
switch (b->type)
|
switch (b->type)
|
||||||
{
|
{
|
||||||
|
@ -10617,89 +10726,7 @@ breakpoint_re_set_one (void *bint)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
input_radix = b->input_radix;
|
re_set_breakpoint (b);
|
||||||
s = b->addr_string;
|
|
||||||
|
|
||||||
save_current_space_and_thread ();
|
|
||||||
switch_to_program_space_and_thread (b->pspace);
|
|
||||||
|
|
||||||
marker_spec = b->type == bp_static_tracepoint && is_marker_spec (s);
|
|
||||||
|
|
||||||
set_language (b->language);
|
|
||||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
|
||||||
{
|
|
||||||
if (marker_spec)
|
|
||||||
{
|
|
||||||
sals = decode_static_tracepoint_spec (&s);
|
|
||||||
if (sals.nelts > b->static_trace_marker_id_idx)
|
|
||||||
{
|
|
||||||
sals.sals[0] = sals.sals[b->static_trace_marker_id_idx];
|
|
||||||
sals.nelts = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
error (_("marker %s not found"), b->static_trace_marker_id);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0,
|
|
||||||
NULL, not_found_ptr);
|
|
||||||
}
|
|
||||||
if (e.reason < 0)
|
|
||||||
{
|
|
||||||
int not_found_and_ok = 0;
|
|
||||||
/* For pending breakpoints, it's expected that parsing will
|
|
||||||
fail until the right shared library is loaded. User has
|
|
||||||
already told to create pending breakpoints and don't need
|
|
||||||
extra messages. If breakpoint is in bp_shlib_disabled
|
|
||||||
state, then user already saw the message about that
|
|
||||||
breakpoint being disabled, and don't want to see more
|
|
||||||
errors. */
|
|
||||||
if (not_found
|
|
||||||
&& (b->condition_not_parsed
|
|
||||||
|| (b->loc && b->loc->shlib_disabled)
|
|
||||||
|| b->enable_state == bp_disabled))
|
|
||||||
not_found_and_ok = 1;
|
|
||||||
|
|
||||||
if (!not_found_and_ok)
|
|
||||||
{
|
|
||||||
/* We surely don't want to warn about the same breakpoint
|
|
||||||
10 times. One solution, implemented here, is disable
|
|
||||||
the breakpoint on error. Another solution would be to
|
|
||||||
have separate 'warning emitted' flag. Since this
|
|
||||||
happens only when a binary has changed, I don't know
|
|
||||||
which approach is better. */
|
|
||||||
b->enable_state = bp_disabled;
|
|
||||||
throw_exception (e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!not_found)
|
|
||||||
{
|
|
||||||
gdb_assert (sals.nelts == 1);
|
|
||||||
|
|
||||||
resolve_sal_pc (&sals.sals[0]);
|
|
||||||
if (b->condition_not_parsed && s && s[0])
|
|
||||||
{
|
|
||||||
char *cond_string = 0;
|
|
||||||
int thread = -1;
|
|
||||||
int task = 0;
|
|
||||||
|
|
||||||
find_condition_and_thread (s, sals.sals[0].pc,
|
|
||||||
&cond_string, &thread, &task);
|
|
||||||
if (cond_string)
|
|
||||||
b->cond_string = cond_string;
|
|
||||||
b->thread = thread;
|
|
||||||
b->task = task;
|
|
||||||
b->condition_not_parsed = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b->type == bp_static_tracepoint && !marker_spec)
|
|
||||||
sals.sals[0] = update_static_tracepoint (b, sals.sals[0]);
|
|
||||||
|
|
||||||
expanded = expand_line_sal_maybe (sals.sals[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
make_cleanup (xfree, sals.sals);
|
|
||||||
update_breakpoint_locations (b, expanded);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bp_watchpoint:
|
case bp_watchpoint:
|
||||||
|
@ -10780,7 +10807,6 @@ breakpoint_re_set_one (void *bint)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
do_cleanups (cleanups);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue