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:
Pedro Alves
2011-05-20 16:31:31 +00:00
parent 751b8ce122
commit 09cee04be9
5 changed files with 73 additions and 36 deletions

View File

@ -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.

View File

@ -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;
} }

View File

@ -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,

View File

@ -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))
{ {

View File

@ -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