diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1994-02-25 09:12:29 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1994-02-25 09:12:29 +0000 |
commit | bcc377184156be31b11f59a95109baa6509c04b2 (patch) | |
tree | 5cead4ce3431e0f9f4896fb641db624eb78dfef0 /gdb/breakpoint.c | |
parent | 3fed1c4a60539e2abd3818985b4aa2899b5da355 (diff) | |
download | gdb-bcc377184156be31b11f59a95109baa6509c04b2.zip gdb-bcc377184156be31b11f59a95109baa6509c04b2.tar.gz gdb-bcc377184156be31b11f59a95109baa6509c04b2.tar.bz2 |
* breakpoint.h (enum bptype): New type bp_through_sigtramp.
(bpstat_what_main_action): New code BPSTAT_WHAT_THROUGH_SIGTRAMP.
* breakpoint.c (bpstat_what): Return BPSTAT_WHAT_THROUGH_SIGTRAMP
if we hit a bp_through_sigtramp breakpoint. Remove kludge which
ignored bs->stop for a bp_step_resume breakpoint.
* infrun.c (wait_for_inferior): Make a through_sigtramp_breakpoint
which performs one (the check_sigtramp2 one) of the functions
which had been handled by the step_resume_breakpoint. For each
use of the step_resume_breakpoint, make it still use the
step_resume_breakpoint, use the through_sigtramp_breakpoint, or
operate on both.
Deal with BPSTAT_WHAT_THROUGH_SIGTRAMP return from bpstat_what.
When setting the frame address of the step resume breakpoint, set
it to the address for frame *before* the call instruction is
executed, not after.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 717335f..93597d4 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1267,6 +1267,9 @@ bpstat_what (bs) /* We hit the step_resume breakpoint. */ step_resume, + /* We hit the through_sigtramp breakpoint. */ + through_sig, + /* This is just used to count how many enums there are. */ class_last }; @@ -1282,6 +1285,7 @@ bpstat_what (bs) #define clrlr BPSTAT_WHAT_CLEAR_LONGJMP_RESUME #define clrlrs BPSTAT_WHAT_CLEAR_LONGJMP_RESUME_SINGLE #define sr BPSTAT_WHAT_STEP_RESUME +#define ts BPSTAT_WHAT_THROUGH_SIGTRAMP /* "Can't happen." Might want to print an error message. abort() is not out of the question, but chances are GDB is just @@ -1299,22 +1303,25 @@ bpstat_what (bs) /* step_resume entries: a step resume breakpoint overrides another breakpoint of signal handling (see comment in wait_for_inferior at first IN_SIGTRAMP where we set the step_resume breakpoint). */ + /* We handle the through_sigtramp_breakpoint the same way; having both + one of those and a step_resume_breakpoint is probably very rare (?). */ static const enum bpstat_what_main_action table[(int)class_last][(int)BPSTAT_WHAT_LAST] = { /* old action */ - /* keep_c stop_s stop_n single setlr clrlr clrlrs sr */ - -/*no_effect*/ {keep_c, stop_s, stop_n, single, setlr , clrlr , clrlrs, sr}, -/*wp_silent*/ {stop_s, stop_s, stop_n, stop_s, stop_s, stop_s, stop_s, sr}, -/*wp_noisy*/ {stop_n, stop_n, stop_n, stop_n, stop_n, stop_n, stop_n, sr}, -/*bp_nostop*/ {single, stop_s, stop_n, single, setlr , clrlrs, clrlrs, sr}, -/*bp_silent*/ {stop_s, stop_s, stop_n, stop_s, stop_s, stop_s, stop_s, sr}, -/*bp_noisy*/ {stop_n, stop_n, stop_n, stop_n, stop_n, stop_n, stop_n, sr}, -/*long_jump*/ {setlr , stop_s, stop_n, setlr , err , err , err , sr}, -/*long_resume*/ {clrlr , stop_s, stop_n, clrlrs, err , err , err , sr}, -/*step_resume*/ {sr , sr , sr , sr , sr , sr , sr , sr} + /* keep_c stop_s stop_n single setlr clrlr clrlrs sr ts + */ +/*no_effect*/ {keep_c,stop_s,stop_n,single, setlr , clrlr , clrlrs, sr, ts}, +/*wp_silent*/ {stop_s,stop_s,stop_n,stop_s, stop_s, stop_s, stop_s, sr, ts}, +/*wp_noisy*/ {stop_n,stop_n,stop_n,stop_n, stop_n, stop_n, stop_n, sr, ts}, +/*bp_nostop*/ {single,stop_s,stop_n,single, setlr , clrlrs, clrlrs, sr, ts}, +/*bp_silent*/ {stop_s,stop_s,stop_n,stop_s, stop_s, stop_s, stop_s, sr, ts}, +/*bp_noisy*/ {stop_n,stop_n,stop_n,stop_n, stop_n, stop_n, stop_n, sr, ts}, +/*long_jump*/ {setlr ,stop_s,stop_n,setlr , err , err , err , sr, ts}, +/*long_resume*/ {clrlr ,stop_s,stop_n,clrlrs, err , err , err , sr, ts}, +/*step_resume*/ {sr ,sr ,sr ,sr , sr , sr , sr , sr, ts}, +/*through_sig*/ {ts ,ts ,ts ,ts , ts , ts , ts , ts, ts} }; #undef keep_c #undef stop_s @@ -1324,6 +1331,8 @@ bpstat_what (bs) #undef clrlr #undef clrlrs #undef err +#undef sr +#undef ts enum bpstat_what_main_action current_action = BPSTAT_WHAT_KEEP_CHECKING; struct bpstat_what retval; @@ -1370,21 +1379,16 @@ bpstat_what (bs) bs_class = long_resume; break; case bp_step_resume: -#if 0 - /* Need to temporarily disable this until we can fix the bug - with nexting over a breakpoint with ->stop clear causing - an infinite loop. For now, treat the breakpoint as having - been hit even if the frame is wrong. */ if (bs->stop) { -#endif bs_class = step_resume; -#if 0 } else /* It is for the wrong frame. */ bs_class = bp_nostop; -#endif + break; + case bp_through_sigtramp: + bs_class = through_sig; break; case bp_call_dummy: /* Make sure the action is stop (silent or noisy), so infrun.c @@ -1468,6 +1472,7 @@ breakpoint_1 (bnum, allflag) case bp_longjmp: case bp_longjmp_resume: case bp_step_resume: + case bp_through_sigtramp: case bp_call_dummy: if (addressprint) printf_filtered ("%s ", local_hex_string_custom ((unsigned long) b->address, "08l")); @@ -1498,6 +1503,7 @@ breakpoint_1 (bnum, allflag) printf_filtered ("\tstop only in stack frame at "); print_address_numeric (b->frame, gdb_stdout); printf_filtered ("\n"); + } if (b->cond) { printf_filtered ("\tstop only if "); @@ -1824,7 +1830,7 @@ mention (b) break; case bp_breakpoint: printf_filtered ("Breakpoint %d at ", b->number); - print_address_numeric (b->address); + print_address_numeric (b->address, gdb_stdout); if (b->source_file) printf_filtered (": file %s, line %d.", b->source_file, b->line_number); @@ -1834,6 +1840,7 @@ mention (b) case bp_longjmp: case bp_longjmp_resume: case bp_step_resume: + case bp_through_sigtramp: case bp_call_dummy: break; } |