[PATCH] More infrun state to be saved per-thread

Michael Snyder msnyder@cygnus.com
Wed Jun 13 16:00:00 GMT 2001


This patch just adds three more infrun state variables, 
current_line, current_symtab, and step_sp, to the list of 
state variables that are saved and restored when the thread
context changes on the target.

The effect is to reduce the number of times that gdb misses
a line when stepping multiple threads.
2001-06-13  Michael Snyder  <msnyder@redhat.com>

	* gdbthread.h (struct thread_info): Add new fields: 
	current_line, current_symtab, step_sp, for saved infrun state.
	* thread.c (save_infrun_state, load_infrun_state): Save and
	restore current_line, current_symtab, and step_sp.
	(add_thread): Rather than adding assignments to initialize
	the new fields, just use memset (tp, 0, sizeof (*tp).
	This way future new fields will not be overlooked.
	* infrun.c (handle_inferior_event): Save and restore save_sp,
	current_line, and current_symtab when switching threads.

Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.35
diff -c -3 -p -r1.35 infrun.c
*** infrun.c	2001/06/02 00:36:20	1.35
--- infrun.c	2001/06/13 22:47:36
*************** handle_inferior_event (struct execution_
*** 2001,2007 ****
  			       ecs->another_trap,
  			       ecs->stepping_through_solib_after_catch,
  			       ecs->stepping_through_solib_catchpoints,
! 			       ecs->stepping_through_sigtramp);
  
  	    /* Load infrun state for the new thread.  */
  	    load_infrun_state (ecs->ptid, &prev_pc,
--- 2001,2009 ----
  			       ecs->another_trap,
  			       ecs->stepping_through_solib_after_catch,
  			       ecs->stepping_through_solib_catchpoints,
! 			       ecs->stepping_through_sigtramp,
! 			       ecs->current_line, ecs->current_symtab, 
! 			       step_sp);
  
  	    /* Load infrun state for the new thread.  */
  	    load_infrun_state (ecs->ptid, &prev_pc,
*************** handle_inferior_event (struct execution_
*** 2013,2019 ****
  			       &ecs->another_trap,
  			       &ecs->stepping_through_solib_after_catch,
  			       &ecs->stepping_through_solib_catchpoints,
! 			       &ecs->stepping_through_sigtramp);
  	  }
  
  	inferior_ptid = ecs->ptid;
--- 2015,2023 ----
  			       &ecs->another_trap,
  			       &ecs->stepping_through_solib_after_catch,
  			       &ecs->stepping_through_solib_catchpoints,
! 			       &ecs->stepping_through_sigtramp, 
! 			       &ecs->current_line, &ecs->current_symtab,
! 			       &step_sp);
  	  }
  
  	inferior_ptid = ecs->ptid;
Index: thread.c
===================================================================
RCS file: /cvs/src/src/gdb/thread.c,v
retrieving revision 1.16
diff -c -3 -p -r1.16 thread.c
*** thread.c	2001/06/02 00:36:20	1.16
--- thread.c	2001/06/13 22:47:36
*************** add_thread (ptid_t ptid)
*** 124,149 ****
  {
    struct thread_info *tp;
  
!   tp = (struct thread_info *) xmalloc (sizeof (struct thread_info));
! 
    tp->ptid = ptid;
    tp->num = ++highest_thread_num;
-   tp->prev_pc = 0;
-   tp->prev_func_start = 0;
-   tp->prev_func_name = NULL;
-   tp->step_range_start = 0;
-   tp->step_range_end = 0;
-   tp->step_frame_address = 0;
-   tp->step_resume_breakpoint = 0;
-   tp->through_sigtramp_breakpoint = 0;
-   tp->handling_longjmp = 0;
-   tp->trap_expected = 0;
-   tp->another_trap = 0;
-   tp->stepping_through_solib_after_catch = 0;
-   tp->stepping_through_solib_catchpoints = NULL;
-   tp->stepping_through_sigtramp = 0;
    tp->next = thread_list;
-   tp->private = NULL;
    thread_list = tp;
    return tp;
  }
--- 124,134 ----
  {
    struct thread_info *tp;
  
!   tp = (struct thread_info *) xmalloc (sizeof (*tp));
!   memset (tp, 0, sizeof (*tp));
    tp->ptid = ptid;
    tp->num = ++highest_thread_num;
    tp->next = thread_list;
    thread_list = tp;
    return tp;
  }
*************** gdb_list_thread_ids (/* output object */
*** 302,316 ****
  /* Load infrun state for the thread PID.  */
  
  void
! load_infrun_state (ptid_t ptid, CORE_ADDR *prev_pc, CORE_ADDR *prev_func_start,
! 		   char **prev_func_name, int *trap_expected,
  		   struct breakpoint **step_resume_breakpoint,
  		   struct breakpoint **through_sigtramp_breakpoint,
! 		   CORE_ADDR *step_range_start, CORE_ADDR *step_range_end,
! 		   CORE_ADDR *step_frame_address, int *handling_longjmp,
! 		   int *another_trap, int *stepping_through_solib_after_catch,
  		   bpstat *stepping_through_solib_catchpoints,
! 		   int *stepping_through_sigtramp)
  {
    struct thread_info *tp;
  
--- 287,310 ----
  /* Load infrun state for the thread PID.  */
  
  void
! load_infrun_state (ptid_t ptid, 
! 		   CORE_ADDR *prev_pc, 
! 		   CORE_ADDR *prev_func_start,
! 		   char **prev_func_name, 
! 		   int *trap_expected,
  		   struct breakpoint **step_resume_breakpoint,
  		   struct breakpoint **through_sigtramp_breakpoint,
! 		   CORE_ADDR *step_range_start, 
! 		   CORE_ADDR *step_range_end,
! 		   CORE_ADDR *step_frame_address, 
! 		   int *handling_longjmp,
! 		   int *another_trap, 
! 		   int *stepping_through_solib_after_catch,
  		   bpstat *stepping_through_solib_catchpoints,
! 		   int *stepping_through_sigtramp,
! 		   int *current_line, 
! 		   struct symtab **current_symtab, 
! 		   CORE_ADDR *step_sp)
  {
    struct thread_info *tp;
  
*************** load_infrun_state (ptid_t ptid, CORE_ADD
*** 323,353 ****
    *prev_pc = tp->prev_pc;
    *prev_func_start = tp->prev_func_start;
    *prev_func_name = tp->prev_func_name;
    *step_resume_breakpoint = tp->step_resume_breakpoint;
    *step_range_start = tp->step_range_start;
    *step_range_end = tp->step_range_end;
    *step_frame_address = tp->step_frame_address;
-   *through_sigtramp_breakpoint = tp->through_sigtramp_breakpoint;
    *handling_longjmp = tp->handling_longjmp;
-   *trap_expected = tp->trap_expected;
    *another_trap = tp->another_trap;
    *stepping_through_solib_after_catch = tp->stepping_through_solib_after_catch;
    *stepping_through_solib_catchpoints = tp->stepping_through_solib_catchpoints;
    *stepping_through_sigtramp = tp->stepping_through_sigtramp;
  }
  
  /* Save infrun state for the thread PID.  */
  
  void
! save_infrun_state (ptid_t ptid, CORE_ADDR prev_pc, CORE_ADDR prev_func_start,
! 		   char *prev_func_name, int trap_expected,
  		   struct breakpoint *step_resume_breakpoint,
  		   struct breakpoint *through_sigtramp_breakpoint,
! 		   CORE_ADDR step_range_start, CORE_ADDR step_range_end,
! 		   CORE_ADDR step_frame_address, int handling_longjmp,
! 		   int another_trap, int stepping_through_solib_after_catch,
  		   bpstat stepping_through_solib_catchpoints,
! 		   int stepping_through_sigtramp)
  {
    struct thread_info *tp;
  
--- 317,359 ----
    *prev_pc = tp->prev_pc;
    *prev_func_start = tp->prev_func_start;
    *prev_func_name = tp->prev_func_name;
+   *trap_expected = tp->trap_expected;
    *step_resume_breakpoint = tp->step_resume_breakpoint;
+   *through_sigtramp_breakpoint = tp->through_sigtramp_breakpoint;
    *step_range_start = tp->step_range_start;
    *step_range_end = tp->step_range_end;
    *step_frame_address = tp->step_frame_address;
    *handling_longjmp = tp->handling_longjmp;
    *another_trap = tp->another_trap;
    *stepping_through_solib_after_catch = tp->stepping_through_solib_after_catch;
    *stepping_through_solib_catchpoints = tp->stepping_through_solib_catchpoints;
    *stepping_through_sigtramp = tp->stepping_through_sigtramp;
+   *current_line = tp->current_line;
+   *current_symtab = tp->current_symtab;
+   *step_sp = tp->step_sp;
  }
  
  /* Save infrun state for the thread PID.  */
  
  void
! save_infrun_state (ptid_t ptid, 
! 		   CORE_ADDR prev_pc, 
! 		   CORE_ADDR prev_func_start,
! 		   char *prev_func_name, 
! 		   int trap_expected,
  		   struct breakpoint *step_resume_breakpoint,
  		   struct breakpoint *through_sigtramp_breakpoint,
! 		   CORE_ADDR step_range_start, 
! 		   CORE_ADDR step_range_end,
! 		   CORE_ADDR step_frame_address, 
! 		   int handling_longjmp,
! 		   int another_trap, 
! 		   int stepping_through_solib_after_catch,
  		   bpstat stepping_through_solib_catchpoints,
! 		   int stepping_through_sigtramp, 
! 		   int current_line,
! 		   struct symtab *current_symtab,
! 		   CORE_ADDR step_sp)
  {
    struct thread_info *tp;
  
*************** save_infrun_state (ptid_t ptid, CORE_ADD
*** 360,376 ****
    tp->prev_pc = prev_pc;
    tp->prev_func_start = prev_func_start;
    tp->prev_func_name = prev_func_name;
    tp->step_resume_breakpoint = step_resume_breakpoint;
    tp->step_range_start = step_range_start;
    tp->step_range_end = step_range_end;
    tp->step_frame_address = step_frame_address;
-   tp->through_sigtramp_breakpoint = through_sigtramp_breakpoint;
    tp->handling_longjmp = handling_longjmp;
-   tp->trap_expected = trap_expected;
    tp->another_trap = another_trap;
    tp->stepping_through_solib_after_catch = stepping_through_solib_after_catch;
    tp->stepping_through_solib_catchpoints = stepping_through_solib_catchpoints;
    tp->stepping_through_sigtramp = stepping_through_sigtramp;
  }
  
  /* Return true if TP is an active thread. */
--- 366,385 ----
    tp->prev_pc = prev_pc;
    tp->prev_func_start = prev_func_start;
    tp->prev_func_name = prev_func_name;
+   tp->trap_expected = trap_expected;
    tp->step_resume_breakpoint = step_resume_breakpoint;
+   tp->through_sigtramp_breakpoint = through_sigtramp_breakpoint;
    tp->step_range_start = step_range_start;
    tp->step_range_end = step_range_end;
    tp->step_frame_address = step_frame_address;
    tp->handling_longjmp = handling_longjmp;
    tp->another_trap = another_trap;
    tp->stepping_through_solib_after_catch = stepping_through_solib_after_catch;
    tp->stepping_through_solib_catchpoints = stepping_through_solib_catchpoints;
    tp->stepping_through_sigtramp = stepping_through_sigtramp;
+   tp->current_line = current_line;
+   tp->current_symtab = current_symtab;
+   tp->step_sp = step_sp;
  }
  
  /* Return true if TP is an active thread. */
Index: gdbthread.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbthread.h,v
retrieving revision 1.4
diff -c -3 -p -r1.4 gdbthread.h
*** gdbthread.h	2001/06/02 00:36:20	1.4
--- gdbthread.h	2001/06/13 22:47:36
*************** struct thread_info
*** 44,49 ****
--- 44,52 ----
    CORE_ADDR step_range_start;
    CORE_ADDR step_range_end;
    CORE_ADDR step_frame_address;
+   CORE_ADDR step_sp;
+   int current_line;
+   struct symtab *current_symtab;
    int trap_expected;
    int handling_longjmp;
    int another_trap;
*************** extern void save_infrun_state (ptid_t pt
*** 120,126 ****
  			       int       another_trap,
  			       int       stepping_through_solib_after_catch,
  			       bpstat    stepping_through_solib_catchpoints,
! 			       int       stepping_through_sigtramp);
  
  /* infrun context switch: load the debugger state previously saved
     for the given thread.  */
--- 123,132 ----
  			       int       another_trap,
  			       int       stepping_through_solib_after_catch,
  			       bpstat    stepping_through_solib_catchpoints,
! 			       int       stepping_through_sigtramp,
! 			       int       current_line,
! 			       struct symtab *current_symtab,
! 			       CORE_ADDR step_sp);
  
  /* infrun context switch: load the debugger state previously saved
     for the given thread.  */
*************** extern void load_infrun_state (ptid_t pt
*** 138,144 ****
  			       int       *another_trap,
  			       int       *stepping_through_solib_affter_catch,
  			       bpstat    *stepping_through_solib_catchpoints,
! 			       int       *stepping_through_sigtramp);
  
  /* Commands with a prefix of `thread'.  */
  extern struct cmd_list_element *thread_cmd_list;
--- 144,153 ----
  			       int       *another_trap,
  			       int       *stepping_through_solib_affter_catch,
  			       bpstat    *stepping_through_solib_catchpoints,
! 			       int       *stepping_through_sigtramp,
! 			       int       *current_line,
! 			       struct symtab **current_symtab,
! 			       CORE_ADDR *step_sp);
  
  /* Commands with a prefix of `thread'.  */
  extern struct cmd_list_element *thread_cmd_list;


More information about the Gdb-patches mailing list