From 101b7f9ca5a7f40394e739e8745b1fcaeee96709 Mon Sep 17 00:00:00 2001 From: Peter Schauer Date: Sat, 22 May 1993 07:40:40 +0000 Subject: [PATCH] * infrun.c (wait_for_inferior): Clear stop_signal if it should not be passed to the inferior to make "handle nopass nostop" work. --- gdb/ChangeLog | 5 ++ gdb/infrun.c | 187 ++++++++++++++++++++++++-------------------------- 2 files changed, 93 insertions(+), 99 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d73865e33b7..d6efc0d27d5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +Sat May 22 00:39:01 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * infrun.c (wait_for_inferior): Clear stop_signal if it should not + be passed to the inferior to make "handle nopass nostop" work. + Sat May 22 00:21:41 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) * config/mips/tm-irix3.h: Clean up, use tm-bigmips.h and redefine diff --git a/gdb/infrun.c b/gdb/infrun.c index ab4e3e0f986..14d85186f77 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1,5 +1,6 @@ /* Target-struct-independent code to start (run) and stop an inferior process. - Copyright 1986, 1987, 1988, 1989, 1991, 1992 Free Software Foundation, Inc. + Copyright 1986, 1987, 1988, 1989, 1991, 1992, 1993 + Free Software Foundation, Inc. This file is part of GDB. @@ -148,22 +149,6 @@ resume_cleanups PARAMS ((int)); static int hook_stop_stub PARAMS ((char *)); -/* Sigtramp is a routine that the kernel calls (which then calls the - signal handler). On most machines it is a library routine that - is linked into the executable. - - This macro, given a program counter value and the name of the - function in which that PC resides (which can be null if the - name is not known), returns nonzero if the PC and name show - that we are in sigtramp. - - On most machines just see if the name is sigtramp (and if we have - no name, assume we are not in sigtramp). */ -#if !defined (IN_SIGTRAMP) -#define IN_SIGTRAMP(pc, name) \ - (name && !strcmp ("_sigtramp", name)) -#endif - /* GET_LONGJMP_TARGET returns the PC at which longjmp() will resume the program. It needs to examine the jmp_buf argument and extract the PC from it. The return value is non-zero on success, zero otherwise. */ @@ -401,15 +386,7 @@ proceed (addr, siggnal, step) oneproc = 1; } else - { - write_register (PC_REGNUM, addr); -#ifdef NPC_REGNUM - write_register (NPC_REGNUM, addr + 4); -#ifdef NNPC_REGNUM - write_register (NNPC_REGNUM, addr + 8); -#endif -#endif - } + write_pc (addr); if (trap_expected_after_continue) { @@ -601,6 +578,10 @@ wait_for_inferior () stop_frame_address = FRAME_FP (get_current_frame ()); stop_sp = read_register (SP_REGNUM); +/* XXX - FIXME. Need to figure out a better way to grab the stack seg reg. */ +#ifdef GDB_TARGET_IS_H8500 + stop_sp |= read_register (SEG_T_REGNUM) << 16; +#endif stop_func_start = 0; stop_func_name = 0; /* Don't care about return value; stop_func_start and stop_func_name @@ -688,8 +669,7 @@ wait_for_inferior () if (DECR_PC_AFTER_BREAK) { stop_pc -= DECR_PC_AFTER_BREAK; - write_register (PC_REGNUM, stop_pc); - pc_changed = 0; + write_pc (stop_pc); } } else @@ -758,6 +738,10 @@ wait_for_inferior () else if (printed) target_terminal_inferior (); + /* Clear the signal if it should not be passed. */ + if (signal_program[stop_signal] == 0) + stop_signal = 0; + /* Note that virtually all the code below does `if !random_signal'. Perhaps this code should end with a goto or continue. At least one (now fixed) bug was caused by this -- a !random_signal was @@ -767,79 +751,81 @@ wait_for_inferior () /* Handle cases caused by hitting a breakpoint. */ if (!random_signal) - if (bpstat_explains_signal (stop_bpstat)) - { - CORE_ADDR jmp_buf_pc; + { + CORE_ADDR jmp_buf_pc; + enum bpstat_what what = bpstat_what (stop_bpstat); - switch (stop_bpstat->breakpoint_at->type) /* FIXME */ - { - /* If we hit the breakpoint at longjmp, disable it for the - duration of this command. Then, install a temporary - breakpoint at the target of the jmp_buf. */ - case bp_longjmp: - disable_longjmp_breakpoint(); - remove_breakpoints (); - breakpoints_inserted = 0; - if (!GET_LONGJMP_TARGET(&jmp_buf_pc)) goto keep_going; + switch (what) + { + case BPSTAT_WHAT_SET_LONGJMP_RESUME: + /* If we hit the breakpoint at longjmp, disable it for the + duration of this command. Then, install a temporary + breakpoint at the target of the jmp_buf. */ + disable_longjmp_breakpoint(); + remove_breakpoints (); + breakpoints_inserted = 0; + if (!GET_LONGJMP_TARGET(&jmp_buf_pc)) goto keep_going; - /* Need to blow away step-resume breakpoint, as it - interferes with us */ - remove_step_breakpoint (); - step_resume_break_address = 0; - stop_step_resume_break = 0; + /* Need to blow away step-resume breakpoint, as it + interferes with us */ + remove_step_breakpoint (); + step_resume_break_address = 0; + stop_step_resume_break = 0; -#if 0 /* FIXME - Need to implement nested temporary breakpoints */ - if (step_over_calls > 0) - set_longjmp_resume_breakpoint(jmp_buf_pc, - get_current_frame()); - else +#if 0 + /* FIXME - Need to implement nested temporary breakpoints */ + if (step_over_calls > 0) + set_longjmp_resume_breakpoint(jmp_buf_pc, + get_current_frame()); + else #endif /* 0 */ - set_longjmp_resume_breakpoint(jmp_buf_pc, NULL); - handling_longjmp = 1; /* FIXME */ - goto keep_going; + set_longjmp_resume_breakpoint(jmp_buf_pc, NULL); + handling_longjmp = 1; /* FIXME */ + goto keep_going; - case bp_longjmp_resume: - remove_breakpoints (); - breakpoints_inserted = 0; -#if 0 /* FIXME - Need to implement nested temporary breakpoints */ - if (step_over_calls - && (stop_frame_address - INNER_THAN step_frame_address)) - { - another_trap = 1; - goto keep_going; - } + case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME: + case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME_SINGLE: + remove_breakpoints (); + breakpoints_inserted = 0; +#if 0 + /* FIXME - Need to implement nested temporary breakpoints */ + if (step_over_calls + && (stop_frame_address + INNER_THAN step_frame_address)) + { + another_trap = 1; + goto keep_going; + } #endif /* 0 */ - disable_longjmp_breakpoint(); - handling_longjmp = 0; /* FIXME */ + disable_longjmp_breakpoint(); + handling_longjmp = 0; /* FIXME */ + if (what == BPSTAT_WHAT_CLEAR_LONGJMP_RESUME) break; + /* else fallthrough */ - default: - fprintf(stderr, "Unknown breakpoint type %d\n", - stop_bpstat->breakpoint_at->type); - case bp_watchpoint: - case bp_breakpoint: - case bp_until: - case bp_finish: - /* Does a breakpoint want us to stop? */ - if (bpstat_stop (stop_bpstat)) - { - stop_print_frame = bpstat_should_print (stop_bpstat); - goto stop_stepping; - } - /* Otherwise, must remove breakpoints and single-step - to get us past the one we hit. */ - else - { - remove_breakpoints (); - remove_step_breakpoint (); - breakpoints_inserted = 0; - another_trap = 1; - } - break; - } - } - else if (stop_step_resume_break) + case BPSTAT_WHAT_SINGLE: + if (breakpoints_inserted) + remove_breakpoints (); + remove_step_breakpoint (); + breakpoints_inserted = 0; + another_trap = 1; + /* Still need to check other stuff, at least the case + where we are stepping and step out of the right range. */ + break; + + case BPSTAT_WHAT_STOP_NOISY: + stop_print_frame = 1; + goto stop_stepping; + + case BPSTAT_WHAT_STOP_SILENT: + stop_print_frame = 0; + goto stop_stepping; + + case BPSTAT_WHAT_KEEP_CHECKING: + break; + } + + if (stop_step_resume_break) { /* But if we have hit the step-resumption breakpoint, remove it. It has done its job getting us here. @@ -881,6 +867,7 @@ wait_for_inferior () another_trap = 1; } } + } /* We come here if we hit a breakpoint but should not stop for it. Possibly we also were stepping @@ -927,12 +914,6 @@ wait_for_inferior () to a subroutine call that we should proceed to the end of. */ else if (!random_signal && step_range_end) { - if (stop_func_start) - { - prologue_pc = stop_func_start; - SKIP_PROLOGUE (prologue_pc); - } - /* Did we just take a signal? */ if (IN_SIGTRAMP (stop_pc, stop_func_name) && !IN_SIGTRAMP (prev_pc, prev_func_name)) @@ -955,6 +936,14 @@ wait_for_inferior () goto save_pc; } + if (stop_func_start) + { + /* Do this after the IN_SIGTRAMP check; it might give + an error. */ + prologue_pc = stop_func_start; + SKIP_PROLOGUE (prologue_pc); + } + /* ==> See comments at top of file on this algorithm. <==*/ if ((stop_pc == stop_func_start -- 2.30.2