mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
* infrun.c (wait_for_inferior): Clear stop_signal if it should not
be passed to the inferior to make "handle <signal> nopass nostop" work.
This commit is contained in:
parent
ac8cf67dca
commit
101b7f9ca5
@ -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 <signal> 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
|
||||
|
187
gdb/infrun.c
187
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
|
||||
|
Loading…
Reference in New Issue
Block a user