mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-01 20:12:01 +08:00
2011-05-20 Pedro Alves <pedro@codesourcery.com>
gdb/ * infcmd.c: Include "inf-loop.h". (step_once): When stepping into an inline subroutine, pretend the target has run. If the target can async, switch the inferior event loop to INF_EXEC_COMPLETE. * inferior.h (user_visible_resume_ptid): Declare. * infrun.c (user_visible_resume_ptid): New function, factored out from `resume'. (resume): Use it. * mi/mi-main.c (mi_execute_async_cli_command): Remove assertion that the current thread is running. Merge async and sync branches.
This commit is contained in:
@ -1,3 +1,17 @@
|
|||||||
|
2011-05-20 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
|
* infcmd.c: Include "inf-loop.h".
|
||||||
|
(step_once): When stepping into an inline subroutine, pretend the
|
||||||
|
target has run. If the target can async, switch the inferior
|
||||||
|
event loop to INF_EXEC_COMPLETE.
|
||||||
|
* inferior.h (user_visible_resume_ptid): Declare.
|
||||||
|
* infrun.c (user_visible_resume_ptid): New function, factored out
|
||||||
|
from `resume'.
|
||||||
|
(resume): Use it.
|
||||||
|
* mi/mi-main.c (mi_execute_async_cli_command): Remove assertion
|
||||||
|
that the current thread is running. Merge async and sync
|
||||||
|
branches.
|
||||||
|
|
||||||
2011-05-20 Pedro Alves <pedro@codesourcery.com>
|
2011-05-20 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* infcmd.c (step_1): Simplify synchronous case.
|
* infcmd.c (step_1): Simplify synchronous case.
|
||||||
|
16
gdb/infcmd.c
16
gdb/infcmd.c
@ -55,6 +55,7 @@
|
|||||||
#include "valprint.h"
|
#include "valprint.h"
|
||||||
#include "inline-frame.h"
|
#include "inline-frame.h"
|
||||||
#include "tracepoint.h"
|
#include "tracepoint.h"
|
||||||
|
#include "inf-loop.h"
|
||||||
|
|
||||||
/* Functions exported for general use, in inferior.h: */
|
/* Functions exported for general use, in inferior.h: */
|
||||||
|
|
||||||
@ -994,12 +995,23 @@ step_once (int skip_subroutines, int single_inst, int count, int thread)
|
|||||||
if (!skip_subroutines && !single_inst
|
if (!skip_subroutines && !single_inst
|
||||||
&& inline_skipped_frames (inferior_ptid))
|
&& inline_skipped_frames (inferior_ptid))
|
||||||
{
|
{
|
||||||
|
ptid_t resume_ptid;
|
||||||
|
|
||||||
|
/* Pretend that we've ran. */
|
||||||
|
resume_ptid = user_visible_resume_ptid (1);
|
||||||
|
set_running (resume_ptid, 1);
|
||||||
|
|
||||||
step_into_inline_frame (inferior_ptid);
|
step_into_inline_frame (inferior_ptid);
|
||||||
if (count > 1)
|
if (count > 1)
|
||||||
step_once (skip_subroutines, single_inst, count - 1, thread);
|
step_once (skip_subroutines, single_inst, count - 1, thread);
|
||||||
else
|
else
|
||||||
/* Pretend that we've stopped. */
|
{
|
||||||
normal_stop ();
|
/* Pretend that we've stopped. */
|
||||||
|
normal_stop ();
|
||||||
|
|
||||||
|
if (target_can_async_p ())
|
||||||
|
inferior_event_handler (INF_EXEC_COMPLETE, NULL);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +188,8 @@ extern void reopen_exec_file (void);
|
|||||||
|
|
||||||
extern void resume (int, enum target_signal);
|
extern void resume (int, enum target_signal);
|
||||||
|
|
||||||
|
extern ptid_t user_visible_resume_ptid (int step);
|
||||||
|
|
||||||
/* From misc files */
|
/* From misc files */
|
||||||
|
|
||||||
extern void default_print_registers_info (struct gdbarch *gdbarch,
|
extern void default_print_registers_info (struct gdbarch *gdbarch,
|
||||||
|
62
gdb/infrun.c
62
gdb/infrun.c
@ -1601,6 +1601,45 @@ maybe_software_singlestep (struct gdbarch *gdbarch, CORE_ADDR pc)
|
|||||||
return hw_step;
|
return hw_step;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return a ptid representing the set of threads that we will proceed,
|
||||||
|
in the perspective of the user/frontend. We may actually resume
|
||||||
|
fewer threads at first, e.g., if a thread is stopped at a
|
||||||
|
breakpoint that needs stepping-off, but that should be visible to
|
||||||
|
the user/frontend, and neither should the frontend/user be allowed
|
||||||
|
to proceed any of the threads that happen to be stopped at for
|
||||||
|
internal run control handling, if a previous command wanted them
|
||||||
|
resumed. */
|
||||||
|
|
||||||
|
ptid_t
|
||||||
|
user_visible_resume_ptid (int step)
|
||||||
|
{
|
||||||
|
/* By default, resume all threads of all processes. */
|
||||||
|
ptid_t resume_ptid = RESUME_ALL;
|
||||||
|
|
||||||
|
/* Maybe resume only all threads of the current process. */
|
||||||
|
if (!sched_multi && target_supports_multi_process ())
|
||||||
|
{
|
||||||
|
resume_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Maybe resume a single thread after all. */
|
||||||
|
if (non_stop)
|
||||||
|
{
|
||||||
|
/* With non-stop mode on, threads are always handled
|
||||||
|
individually. */
|
||||||
|
resume_ptid = inferior_ptid;
|
||||||
|
}
|
||||||
|
else if ((scheduler_mode == schedlock_on)
|
||||||
|
|| (scheduler_mode == schedlock_step
|
||||||
|
&& (step || singlestep_breakpoints_inserted_p)))
|
||||||
|
{
|
||||||
|
/* User-settable 'scheduler' mode requires solo thread resume. */
|
||||||
|
resume_ptid = inferior_ptid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return resume_ptid;
|
||||||
|
}
|
||||||
|
|
||||||
/* Resume the inferior, but allow a QUIT. This is useful if the user
|
/* Resume the inferior, but allow a QUIT. This is useful if the user
|
||||||
wants to interrupt some lengthy single-stepping operation
|
wants to interrupt some lengthy single-stepping operation
|
||||||
(for child processes, the SIGINT goes to the inferior, and so
|
(for child processes, the SIGINT goes to the inferior, and so
|
||||||
@ -1762,15 +1801,7 @@ a command like `return' or `jump' to continue execution."));
|
|||||||
/* Decide the set of threads to ask the target to resume. Start
|
/* Decide the set of threads to ask the target to resume. Start
|
||||||
by assuming everything will be resumed, than narrow the set
|
by assuming everything will be resumed, than narrow the set
|
||||||
by applying increasingly restricting conditions. */
|
by applying increasingly restricting conditions. */
|
||||||
|
resume_ptid = user_visible_resume_ptid (step);
|
||||||
/* By default, resume all threads of all processes. */
|
|
||||||
resume_ptid = RESUME_ALL;
|
|
||||||
|
|
||||||
/* Maybe resume only all threads of the current process. */
|
|
||||||
if (!sched_multi && target_supports_multi_process ())
|
|
||||||
{
|
|
||||||
resume_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Maybe resume a single thread after all. */
|
/* Maybe resume a single thread after all. */
|
||||||
if (singlestep_breakpoints_inserted_p
|
if (singlestep_breakpoints_inserted_p
|
||||||
@ -1804,19 +1835,6 @@ a command like `return' or `jump' to continue execution."));
|
|||||||
breakpoint, not just the one at PC. */
|
breakpoint, not just the one at PC. */
|
||||||
resume_ptid = inferior_ptid;
|
resume_ptid = inferior_ptid;
|
||||||
}
|
}
|
||||||
else if (non_stop)
|
|
||||||
{
|
|
||||||
/* With non-stop mode on, threads are always handled
|
|
||||||
individually. */
|
|
||||||
resume_ptid = inferior_ptid;
|
|
||||||
}
|
|
||||||
else if ((scheduler_mode == schedlock_on)
|
|
||||||
|| (scheduler_mode == schedlock_step
|
|
||||||
&& (step || singlestep_breakpoints_inserted_p)))
|
|
||||||
{
|
|
||||||
/* User-settable 'scheduler' mode requires solo thread resume. */
|
|
||||||
resume_ptid = inferior_ptid;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gdbarch_cannot_step_breakpoint (gdbarch))
|
if (gdbarch_cannot_step_breakpoint (gdbarch))
|
||||||
{
|
{
|
||||||
|
@ -2162,18 +2162,9 @@ mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
|
|||||||
|
|
||||||
execute_command ( /*ui */ run, 0 /*from_tty */ );
|
execute_command ( /*ui */ run, 0 /*from_tty */ );
|
||||||
|
|
||||||
if (target_can_async_p ())
|
/* Do this before doing any printing. It would appear that some
|
||||||
{
|
print code leaves garbage around in the buffer. */
|
||||||
/* If we're not executing, an exception should have been throw. */
|
do_cleanups (old_cleanups);
|
||||||
gdb_assert (is_running (inferior_ptid));
|
|
||||||
do_cleanups (old_cleanups);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Do this before doing any printing. It would appear that some
|
|
||||||
print code leaves garbage around in the buffer. */
|
|
||||||
do_cleanups (old_cleanups);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user