diff options
author | Jeff Law <law@redhat.com> | 1996-04-24 06:36:10 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1996-04-24 06:36:10 +0000 |
commit | 894d8e69468e4ba44539fa297ae216bc9885f789 (patch) | |
tree | ee1c6fb3d4f41db5538818b33e3755375472521c | |
parent | a0e1eb422568457e11d8bf1baed5cc6042200285 (diff) | |
download | gdb-894d8e69468e4ba44539fa297ae216bc9885f789.zip gdb-894d8e69468e4ba44539fa297ae216bc9885f789.tar.gz gdb-894d8e69468e4ba44539fa297ae216bc9885f789.tar.bz2 |
* 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)..
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | 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 <fnf@cygnus.com> + + * 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 <shebs@andros.cygnus.com> * 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 |