[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