[RFA] enable software single step on alpha-osf

Andrew Cagney ac131313@ges.redhat.com
Sun Aug 4 16:42:00 GMT 2002


(Not just a patch involving DECR_PC_AFTER_BREAK but also something that 
involves WFI, outch!)

Can you confirm that the code is encountering a situtation where both 
breakpoints_inserted and singlestep_breakpoints_inserted_p are true.  I 
think this occures when doing a single step after stepping off of a 
breakpoint.  When single stepping off a breakpoint, only 
singlestep_breakpoints_inserted_p would be true.

If this is the case then the comments should make mention of it.  It 
also makes the re-ordered if statement part of the patch correct.

The second part of the change is more tricky:
  +           stop_pc -= DECR_PC_AFTER_BREAK;
Is it fixing any failures?  Software singlestep can be handled in two 
different ways:
- as a breakpoint
- as a hardware single step
and which is prefered decides if/when there should be a decrement.

Anyway, the thing I'm having trouble convincing myself that there can't 
be a double decrement -- eg for a hardware watchpoint or similar.

Andrew

PS: A patch to purge the macro SHIFT_INST_REGS is pre-approved :-)

> Other problems surfaced, however. The SIGSEGVs and the SIGTRAPs
> disappeared, but "next" sometimes stopped at the wrong location.
> 
> The following patch enables software single stepping. It also fixes
> all the problems I found when comparing the testsuite results before and
> after the switch. The test results are now identical before and after my
> changes. For the record, here is a summary of the results I get:
> 
>         # of expected passes            7246
>         # of unexpected failures        680
>         # of unexpected successes       5
>         # of expected failures          149
>         # of unresolved testcases       59
>         # of untested testcases         3
>         # of unsupported tests          2
> 
> I also verified on a linux machine, where software
> single-stepping is not enabled, that no regression was introduced.
> 
> It would be interesting to see how this change influences the results
> of alpha-netbsd. It should improve them.
> 
> Ok to commit?
> 
> 2002-07-18  Joel Brobecker  <brobecker@gnat.com>
> 
>         * alpha-osf1-tdep.c (alpha_osf1_init_abi): Unfortunately,
>         procfs appears to be broken when debugging on multi-processor
>         machines. So enable software single stepping in order to avoid
>         using the procfs interface to do next/step operations, using
>         internal breakpoints instead.
> 
>         * infrun.c (handle_inferior_event): When receiving a SIGTRAP
>         signal, check whether we hit a breakpoint before checking for a
>         single step breakpoint. Otherwise, GDB fails to notice that a
>         breakpoint has been hit when stepping onto a breakpoint.
>         Readjust the stop_pc by DECR_PC_AFTER_BREAK when hitting a
>         single step breakpoint, to make this pc address equal to the
>         value it would have if the system stepping capability was used.
> 
>         * breakpoint.c (bpstat_stop_status): Do not adjust the PC
>         address by DECR_PC_AFTER_BREAK when software single step is
>         in use for this architecture, as this has already been taken
>         care of in handle_inferior_event().
> 
> -- Joel
> 
> 
> 
> Index: alpha-osf1-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/alpha-osf1-tdep.c,v
> retrieving revision 1.5
> diff -c -3 -p -r1.5 alpha-osf1-tdep.c
> *** alpha-osf1-tdep.c	21 May 2002 15:36:02 -0000	1.5
> --- alpha-osf1-tdep.c	18 Jul 2002 20:29:34 -0000
> *************** alpha_osf1_init_abi (struct gdbarch_info
> *** 58,63 ****
> --- 58,67 ----
>     struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
>   
>     set_gdbarch_pc_in_sigtramp (gdbarch, alpha_osf1_pc_in_sigtramp);
> +   /* The next/step support via procfs on OSF1 is broken when running
> +      on multi-processor machines. We need to use software single stepping
> +      instead.  */
> +   set_gdbarch_software_single_step (gdbarch, alpha_software_single_step);
>   
>     tdep->skip_sigtramp_frame = alpha_osf1_skip_sigtramp_frame;
>     tdep->sigcontext_addr = alpha_osf1_sigcontext_addr;
> Index: infrun.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infrun.c,v
> retrieving revision 1.63
> diff -c -3 -p -r1.63 infrun.c
> *** infrun.c	18 Jul 2002 17:53:49 -0000	1.63
> --- infrun.c	18 Jul 2002 20:29:36 -0000
> *************** handle_inferior_event (struct execution_
> *** 1826,1835 ****
>   
>     if (stop_signal == TARGET_SIGNAL_TRAP)
>       {
> !       if (SOFTWARE_SINGLE_STEP_P () && singlestep_breakpoints_inserted_p)
> ! 	ecs->random_signal = 0;
> !       else if (breakpoints_inserted
> ! 	       && breakpoint_here_p (stop_pc - DECR_PC_AFTER_BREAK))
>   	{
>   	  ecs->random_signal = 0;
>   	  if (!breakpoint_thread_match (stop_pc - DECR_PC_AFTER_BREAK,
> --- 1826,1836 ----
>   
>     if (stop_signal == TARGET_SIGNAL_TRAP)
>       {
> !       /* Check if a regular breakpoint has been hit before checking
> !          for a potential single step breakpoint. Otherwise, GDB will
> !          not see this breakpoint hit when stepping onto breakpoints.  */
> !       if (breakpoints_inserted
> !           && breakpoint_here_p (stop_pc - DECR_PC_AFTER_BREAK))
>   	{
>   	  ecs->random_signal = 0;
>   	  if (!breakpoint_thread_match (stop_pc - DECR_PC_AFTER_BREAK,
> *************** handle_inferior_event (struct execution_
> *** 1885,1890 ****
> --- 1886,1901 ----
>   		}
>   	    }
>   	}
> +       else if (SOFTWARE_SINGLE_STEP_P () && singlestep_breakpoints_inserted_p)
> +         {
> +           /* Readjust the stop_pc as it is off by DECR_PC_AFTER_BREAK
> +              compared to the value it would have if the system stepping
> +              capability was used. This allows the rest of the code in
> +              this function to use this address without having to worry
> +              whether software single step is in use or not.  */
> +           stop_pc -= DECR_PC_AFTER_BREAK;
> +           ecs->random_signal = 0;
> +         }
>       }
>     else
>       ecs->random_signal = 1;
> Index: breakpoint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/breakpoint.c,v
> retrieving revision 1.78
> diff -c -3 -p -r1.78 breakpoint.c
> *** breakpoint.c	26 Jun 2002 05:20:04 -0000	1.78
> --- breakpoint.c	18 Jul 2002 20:29:42 -0000
> *************** bpstat_stop_status (CORE_ADDR *pc, int n
> *** 2429,2436 ****
>        trap event.  For a trace/singlestep trap event, we would
>        not want to subtract DECR_PC_AFTER_BREAK from the PC. */
>   
> !   bp_addr = *pc - (not_a_breakpoint && !SOFTWARE_SINGLE_STEP_P () ? 
> !                    0 : DECR_PC_AFTER_BREAK);
>   
>     ALL_BREAKPOINTS_SAFE (b, temp)
>     {
> --- 2429,2435 ----
>        trap event.  For a trace/singlestep trap event, we would
>        not want to subtract DECR_PC_AFTER_BREAK from the PC. */
>   
> !   bp_addr = *pc - (not_a_breakpoint ? 0 : DECR_PC_AFTER_BREAK);
>   
>     ALL_BREAKPOINTS_SAFE (b, temp)
>     {




More information about the Gdb-patches mailing list