From 894d8e69468e4ba44539fa297ae216bc9885f789 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 24 Apr 1996 06:36:10 +0000 Subject: [PATCH] * infrun.c (wait_for_inferior): Move "have_waited" label outside of #ifdef conditionals. Don't trash the wait status if we get a signal and the current instruction is nullified. Fixes long standing problem on the PA (spurious SIGTRAPs).. --- gdb/ChangeLog | 11 +++++++++++ gdb/infrun.c | 30 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8644c03..b8f32fc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +Wed Apr 24 00:32:55 1996 Jeffrey A Law (law@cygnus.com) + + * infrun.c (wait_for_inferior): Move "have_waited" label + outside of #ifdef conditionals. Don't trash the wait status + if we get a signal and the current instruction is nullified. + +Mon Apr 22 20:17:01 1996 Fred Fish + + * Makefile.in (VERSION): Bump version number to 4.16.1 + * NEWS: Update for 4.16 release. + Mon Apr 22 16:32:29 1996 Stan Shebs * monitor.h: Clean up comment formatting. diff --git a/gdb/infrun.c b/gdb/infrun.c index 3a68e34..568147a 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -200,6 +200,8 @@ extern int one_stepped; /* From machine dependent code */ extern void single_step (); /* Same. */ #endif /* NO_SINGLE_STEP */ +extern void write_pc_pid PARAMS ((CORE_ADDR, int)); + /* Things to clean up if we QUIT out of resume (). */ /* ARGSUSED */ @@ -457,7 +459,10 @@ wait_for_inferior () CORE_ADDR stop_func_start; CORE_ADDR stop_func_end; char *stop_func_name; - CORE_ADDR prologue_pc = 0, tmp; +#if 0 + CORE_ADDR prologue_pc = 0; +#endif + CORE_ADDR tmp; struct symtab_and_line sal; int remove_breakpoints_on_following_step = 0; int current_line; @@ -498,9 +503,12 @@ wait_for_inferior () else pid = target_wait (-1, &w); -#ifdef HAVE_NONSTEPPABLE_WATCHPOINT + /* Gross. + + We goto this label from elsewhere in wait_for_inferior when we want + to continue the main loop without calling "wait" and trashing the + waitstatus contained in W. */ have_waited: -#endif flush_cached_frames (); @@ -712,8 +720,20 @@ wait_for_inferior () if (INSTRUCTION_NULLIFIED) { - resume (1, 0); - continue; + struct target_waitstatus tmpstatus; + + target_resume (pid, 1, TARGET_SIGNAL_0); + + /* We may have received a signal that we want to pass to + the inferior; therefore, we must not clobber the waitstatus + in W. So we call wait ourselves, then continue the loop + at the "have_waited" label. */ + if (target_wait_hook) + target_wait_hook (pid, &tmpstatus); + else + target_wait (pid, &tmpstatus); + + goto have_waited; } #ifdef HAVE_STEPPABLE_WATCHPOINT -- 2.7.4