This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: [RFA] 'set step-mode' to control the step command.


Christopher Faylor writes:
 > On Mon, Nov 06, 2000 at 05:03:32PM -0500, Christopher Faylor wrote:
 > >So, I will submit a revised patch with a enum'ized step_over_calls but keep
 > >the step_stop_if_no_debug, if that is ok.
 > 
 > And, here it is.  There were no regressions with this patch.
 > 
 > I haven't added a test suite entry for this but it is coming.
 > 
 > Is this ok?


Yes. It is fine with me.

Elena


 > 
 > cgf
 > 
 > 2000-11-07  Christopher Faylor <cgf@cygnus.com>
 > 
 >         * inferior.h (step_over_calls_kind): New enum to clarify values in step_over_calls.
 >         * infcmd.c (step_over_calls): Change definition.
 > 	(step_1): Use new enum values in relation to step_over_calls.
 >         (step_once): Ditto.
 >         (until_next_command): Ditto.
 >         * infrun.c (clear_proceed_status): Ditto.
 >         (handle_inferior_event): Ditto.
 > 
 > 2000-11-06  Stephane Carrez  <Stephane.Carrez@sun.com>
 > 
 >         * inferior.h (step_stop_if_no_debug): New variable.
 >         * infrun.c (step_stop_if_no_debug): Declare.
 >         (handle_inferior_event): Stop the step command if we entered a function
 >         without line info.
 >         (_initialize_infrun): New command 'set step-mode' to control the step
 >         command.
 >         * infcmd.c (step_once): Switch to stepi mode if there is no line info
 >         (and switching is enabled).
 > 
 > Index: infcmd.c
 > ===================================================================
 > RCS file: /cvs/uberbaum/gdb/infcmd.c,v
 > retrieving revision 1.12
 > diff -u -p -r1.12 infcmd.c
 > --- infcmd.c	2000/10/30 15:32:51	1.12
 > +++ infcmd.c	2000/11/07 06:28:06
 > @@ -178,12 +178,8 @@ CORE_ADDR step_frame_address;
 >  
 >  CORE_ADDR step_sp;
 >  
 > -/* 1 means step over all subroutine calls.
 > -   0 means don't step over calls (used by stepi).
 > -   -1 means step over calls to undebuggable functions.  */
 > +enum step_over_calls_kind step_over_calls;
 >  
 > -int step_over_calls;
 > -
 >  /* If stepping, nonzero means step count is > 1
 >     so don't print frame next time inferior stops
 >     if it stops due to stepping.  */
 > @@ -513,11 +509,11 @@ which has no line number information.\n"
 >  		/* It is stepi.
 >  		   Don't step over function calls, not even to functions lacking
 >  		   line numbers.  */
 > -		step_over_calls = 0;
 > +		step_over_calls = STEP_OVER_NONE;
 >  	    }
 >  
 >  	  if (skip_subroutines)
 > -	    step_over_calls = 1;
 > +	    step_over_calls = STEP_OVER_ALL;
 >  
 >  	  step_multi = (count > 1);
 >  	  proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1);
 > @@ -607,7 +603,13 @@ step_once (int skip_subroutines, int sin
 >        if (!single_inst)
 >  	{
 >  	  find_pc_line_pc_range (stop_pc, &step_range_start, &step_range_end);
 > -	  if (step_range_end == 0)
 > +
 > +	  /* If we have no line info, switch to stepi mode.  */
 > +	  if (step_range_end == 0 && step_stop_if_no_debug)
 > +	    {
 > +	      step_range_start = step_range_end = 1;
 > +	    }
 > +	  else if (step_range_end == 0)
 >  	    {
 >  	      char *name;
 >  	      if (find_pc_partial_function (stop_pc, &name, &step_range_start,
 > @@ -628,11 +630,11 @@ which has no line number information.\n"
 >  	    /* It is stepi.
 >  	       Don't step over function calls, not even to functions lacking
 >  	       line numbers.  */
 > -	    step_over_calls = 0;
 > +	    step_over_calls = STEP_OVER_NONE;
 >  	}
 >  
 >        if (skip_subroutines)
 > -	step_over_calls = 1;
 > +	step_over_calls = STEP_OVER_ALL;
 >  
 >        step_multi = (count > 1);
 >        arg1 =
 > @@ -958,7 +960,7 @@ until_next_command (int from_tty)
 >        step_range_end = sal.end;
 >      }
 >  
 > -  step_over_calls = 1;
 > +  step_over_calls = STEP_OVER_ALL;
 >    step_frame_address = FRAME_FP (frame);
 >    step_sp = read_sp ();
 >  
 > Index: inferior.h
 > ===================================================================
 > RCS file: /cvs/uberbaum/gdb/inferior.h,v
 > retrieving revision 1.11
 > diff -u -p -r1.11 inferior.h
 > --- inferior.h	2000/08/01 14:48:01	1.11
 > +++ inferior.h	2000/11/07 06:28:06
 > @@ -125,6 +125,11 @@ extern void clear_proceed_status (void);
 >  
 >  extern void proceed (CORE_ADDR, enum target_signal, int);
 >  
 > +/* When set, stop the 'step' command if we enter a function which has
 > +   no line number information.  The normal behavior is that we step
 > +   over such function.  */
 > +extern int step_stop_if_no_debug;
 > +
 >  extern void kill_inferior (void);
 >  
 >  extern void generic_mourn_inferior (void);
 > @@ -335,7 +340,12 @@ extern CORE_ADDR step_sp;
 >  /* 1 means step over all subroutine calls.
 >     -1 means step over calls to undebuggable functions.  */
 >  
 > -extern int step_over_calls;
 > +enum step_over_calls_kind
 > +  {
 > +    STEP_OVER_NONE,
 > +    STEP_OVER_ALL,
 > +    STEP_OVER_UNDEBUGGABLE,
 > +  } step_over_calls;
 >  
 >  /* If stepping, nonzero means step count is > 1
 >     so don't print frame next time inferior stops
 > Index: infrun.c
 > ===================================================================
 > RCS file: /cvs/uberbaum/gdb/infrun.c,v
 > retrieving revision 1.20
 > diff -u -p -r1.20 infrun.c
 > --- infrun.c	2000/10/30 15:32:51	1.20
 > +++ infrun.c	2000/11/07 06:28:06
 > @@ -84,6 +84,11 @@ void _initialize_infrun (void);
 >  int inferior_ignoring_startup_exec_events = 0;
 >  int inferior_ignoring_leading_exec_events = 0;
 >  
 > +/* When set, stop the 'step' command if we enter a function which has
 > +   no line number information.  The normal behavior is that we step
 > +   over such function.  */
 > +int step_stop_if_no_debug = 0;
 > +
 >  /* In asynchronous mode, but simulating synchronous execution. */
 >  
 >  int sync_execution = 0;
 > @@ -940,7 +945,7 @@ clear_proceed_status (void)
 >    step_range_start = 0;
 >    step_range_end = 0;
 >    step_frame_address = 0;
 > -  step_over_calls = -1;
 > +  step_over_calls = STEP_OVER_UNDEBUGGABLE;
 >    stop_after_trap = 0;
 >    stop_soon_quietly = 0;
 >    proceed_to_finish = 0;
 > @@ -2612,7 +2617,7 @@ handle_inferior_event (struct execution_
 >         loader dynamic symbol resolution code, we keep on single stepping
 >         until we exit the run time loader code and reach the callee's
 >         address.  */
 > -    if (step_over_calls < 0 && IN_SOLIB_DYNSYM_RESOLVE_CODE (stop_pc))
 > +    if (step_over_calls == STEP_OVER_UNDEBUGGABLE && IN_SOLIB_DYNSYM_RESOLVE_CODE (stop_pc))
 >        {
 >  	CORE_ADDR pc_after_resolver = SKIP_SOLIB_RESOLVER (stop_pc);
 >  
 > @@ -2733,7 +2738,7 @@ handle_inferior_event (struct execution_
 >        {
 >  	/* It's a subroutine call.  */
 >  
 > -	if (step_over_calls == 0)
 > +	if (step_over_calls == STEP_OVER_NONE)
 >  	  {
 >  	    /* I presume that step_over_calls is only 0 when we're
 >  	       supposed to be stepping at the assembly language level
 > @@ -2744,7 +2749,7 @@ handle_inferior_event (struct execution_
 >  	    return;
 >  	  }
 >  
 > -	if (step_over_calls > 0 || IGNORE_HELPER_CALL (stop_pc))
 > +	if (step_over_calls == STEP_OVER_ALL || IGNORE_HELPER_CALL (stop_pc))
 >  	  {
 >  	    /* We're doing a "next".  */
 >  
 > @@ -2810,6 +2815,18 @@ handle_inferior_event (struct execution_
 >  	      return;
 >  	    }
 >  	}
 > +
 > +	/* If we have no line number and the step-stop-if-no-debug
 > +	   is set, we stop the step so that the user has a chance to
 > +	   switch in assembly mode.  */
 > +	if (step_over_calls == STEP_OVER_UNDEBUGGABLE && step_stop_if_no_debug)
 > +	  {
 > +	    stop_step = 1;
 > +	    print_stop_reason (END_STEPPING_RANGE, 0);
 > +	    stop_stepping (ecs);
 > +	    return;
 > +	  }
 > +
 >  	step_over_function (ecs);
 >  	keep_going (ecs);
 >  	return;
 > @@ -3934,7 +3951,7 @@ struct inferior_status
 >    CORE_ADDR step_range_start;
 >    CORE_ADDR step_range_end;
 >    CORE_ADDR step_frame_address;
 > -  int step_over_calls;
 > +  enum step_over_calls_kind step_over_calls;
 >    CORE_ADDR step_resume_break_address;
 >    int stop_after_trap;
 >    int stop_soon_quietly;
 > @@ -4308,5 +4325,14 @@ step == scheduler locked during every si
 >  			&setlist);
 >  
 >    c->function.sfunc = set_schedlock_func;	/* traps on target vector */
 > +  add_show_from_set (c, &showlist);
 > +
 > +  c = add_set_cmd ("step-mode", class_run,
 > +		   var_boolean, (char*) &step_stop_if_no_debug,
 > +"Set mode of the step operation. When set, doing a step over a\n\
 > +function without debug line information will stop at the first\n\
 > +instruction of that function. Otherwise, the function is skipped and\n\
 > +the step command stops at a different source line.",
 > +			&setlist);
 >    add_show_from_set (c, &showlist);
 >  }
 > Index: doc/gdb.texinfo
 > ===================================================================
 > RCS file: /cvs/uberbaum/gdb/doc/gdb.texinfo,v
 > retrieving revision 1.28
 > diff -u -p -r1.28 gdb.texinfo
 > --- gdb.texinfo	2000/10/16 07:34:02	1.28
 > +++ gdb.texinfo	2000/11/07 06:28:09
 > @@ -3323,6 +3323,16 @@ The @code{next} command only stops at th
 >  source line.  This prevents multiple stops that could otherwise occur in
 >  switch statements, for loops, etc.
 >  
 > +@kindex set step-mode
 > +@item set step-mode
 > +@itemx set step-mode on
 > +When stepping over functions, cause gdb to stop at the first instruction
 > +of a function which contains no debug line information.
 > +
 > +@itemx set step-mode off
 > +When stepping over functions, cause gdb to skip over any function which
 > +contains no debug information.  This is the default.
 > +
 >  @kindex finish
 >  @item finish
 >  Continue running until just after function in the selected stack frame

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]