From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH] Remove reset_ecs
Date: Mon, 21 Nov 2022 10:58:30 -0700 [thread overview]
Message-ID: <20221121175830.3585569-1-tom@tromey.com> (raw)
I noticed that execution_control_state has a 'reset' method, and
there's also a 'reset_ecs' function that calls it. This patch cleans
this area up a little by adding a parameter to the constructor and the
reset method. Some extraneous variables are also removed, like here:
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
Here 'ecs' is never changed, so this patch removes it entirely in
favor of just using the object everywhere.
Regression tested on x86-64 Fedora 34.
---
gdb/infrun.c | 103 +++++++++++++++++++++------------------------------
1 file changed, 42 insertions(+), 61 deletions(-)
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 96346e1f25b..33818852c18 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1854,16 +1854,19 @@ displaced_step_finish (thread_info *event_thread, enum gdb_signal signal)
discarded between events. */
struct execution_control_state
{
- execution_control_state ()
+ explicit execution_control_state (thread_info *thr = nullptr)
{
- this->reset ();
+ this->reset (thr);
}
- void reset ()
+ void reset (thread_info *thr)
{
this->target = nullptr;
- this->ptid = null_ptid;
- this->event_thread = nullptr;
+ this->event_thread = thr;
+ if (thr == nullptr)
+ this->ptid = null_ptid;
+ else
+ this->ptid = thr->ptid;
ws = target_waitstatus ();
stop_func_filled_in = 0;
stop_func_start = 0;
@@ -1893,16 +1896,6 @@ struct execution_control_state
int hit_singlestep_breakpoint;
};
-/* Clear ECS and set it to point at TP. */
-
-static void
-reset_ecs (struct execution_control_state *ecs, struct thread_info *tp)
-{
- ecs->reset ();
- ecs->event_thread = tp;
- ecs->ptid = tp->ptid;
-}
-
static void keep_going_pass_signal (struct execution_control_state *ecs);
static void prepare_to_wait (struct execution_control_state *ecs);
static bool keep_going_stepped_thread (struct thread_info *tp);
@@ -1955,8 +1948,6 @@ start_step_over (void)
for (thread_info *tp : range)
{
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
step_over_what step_what;
int must_be_in_line;
@@ -2027,10 +2018,10 @@ start_step_over (void)
continue;
switch_to_thread (tp);
- reset_ecs (ecs, tp);
- keep_going_pass_signal (ecs);
+ execution_control_state ecs (tp);
+ keep_going_pass_signal (&ecs);
- if (!ecs->wait_some_more)
+ if (!ecs.wait_some_more)
error (_("Command aborted."));
/* If the thread's step over could not be initiated because no buffers
@@ -3161,8 +3152,6 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
struct regcache *regcache;
struct gdbarch *gdbarch;
CORE_ADDR pc;
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
/* If we're stopped at a fork/vfork, follow the branch set by the
"set follow-fork-mode" command; otherwise, we'll just proceed
@@ -3374,10 +3363,10 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
infrun_debug_printf ("resuming %s",
tp->ptid.to_string ().c_str ());
- reset_ecs (ecs, tp);
+ execution_control_state ecs (tp);
switch_to_thread (tp);
- keep_going_pass_signal (ecs);
- if (!ecs->wait_some_more)
+ keep_going_pass_signal (&ecs);
+ if (!ecs.wait_some_more)
error (_("Command aborted."));
}
}
@@ -3390,10 +3379,10 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
&& cur_thr->inf->thread_waiting_for_vfork_done != nullptr))
{
/* The thread wasn't started, and isn't queued, run it now. */
- reset_ecs (ecs, cur_thr);
+ execution_control_state ecs (cur_thr);
switch_to_thread (cur_thr);
- keep_going_pass_signal (ecs);
- if (!ecs->wait_some_more)
+ keep_going_pass_signal (&ecs);
+ if (!ecs.wait_some_more)
error (_("Command aborted."));
}
@@ -4001,8 +3990,7 @@ wait_for_inferior (inferior *inf)
while (1)
{
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
+ execution_control_state ecs;
overlay_cache_invalid = 1;
@@ -4012,16 +4000,16 @@ wait_for_inferior (inferior *inf)
don't get any event. */
target_dcache_invalidate ();
- ecs->ptid = do_target_wait_1 (inf, minus_one_ptid, &ecs->ws, 0);
- ecs->target = inf->process_target ();
+ ecs.ptid = do_target_wait_1 (inf, minus_one_ptid, &ecs.ws, 0);
+ ecs.target = inf->process_target ();
if (debug_infrun)
- print_target_wait_results (minus_one_ptid, ecs->ptid, ecs->ws);
+ print_target_wait_results (minus_one_ptid, ecs.ptid, ecs.ws);
/* Now figure out what to do with the result of the result. */
- handle_inferior_event (ecs);
+ handle_inferior_event (&ecs);
- if (!ecs->wait_some_more)
+ if (!ecs.wait_some_more)
break;
}
@@ -4147,8 +4135,7 @@ fetch_inferior_event ()
{
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
+ execution_control_state ecs;
int cmd_done = 0;
/* Events are always processed with the main UI as current UI. This
@@ -4198,27 +4185,27 @@ fetch_inferior_event ()
the event. */
scoped_disable_commit_resumed disable_commit_resumed ("handling event");
- if (!do_target_wait (ecs, TARGET_WNOHANG))
+ if (!do_target_wait (&ecs, TARGET_WNOHANG))
{
infrun_debug_printf ("do_target_wait returned no event");
disable_commit_resumed.reset_and_commit ();
return;
}
- gdb_assert (ecs->ws.kind () != TARGET_WAITKIND_IGNORE);
+ gdb_assert (ecs.ws.kind () != TARGET_WAITKIND_IGNORE);
/* Switch to the target that generated the event, so we can do
target calls. */
- switch_to_target_no_thread (ecs->target);
+ switch_to_target_no_thread (ecs.target);
if (debug_infrun)
- print_target_wait_results (minus_one_ptid, ecs->ptid, ecs->ws);
+ print_target_wait_results (minus_one_ptid, ecs.ptid, ecs.ws);
/* If an error happens while handling the event, propagate GDB's
knowledge of the executing state to the frontend/user running
state. */
- ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs->ptid;
- scoped_finish_thread_state finish_state (ecs->target, finish_ptid);
+ ptid_t finish_ptid = !target_is_non_stop_p () ? minus_one_ptid : ecs.ptid;
+ scoped_finish_thread_state finish_state (ecs.target, finish_ptid);
/* Get executed before scoped_restore_current_thread above to apply
still for the thread which has thrown the exception. */
@@ -4228,13 +4215,13 @@ fetch_inferior_event ()
= make_scope_exit (delete_just_stopped_threads_infrun_breakpoints);
/* Now figure out what to do with the result of the result. */
- handle_inferior_event (ecs);
+ handle_inferior_event (&ecs);
- if (!ecs->wait_some_more)
+ if (!ecs.wait_some_more)
{
- struct inferior *inf = find_inferior_ptid (ecs->target, ecs->ptid);
+ struct inferior *inf = find_inferior_ptid (ecs.target, ecs.ptid);
bool should_stop = true;
- struct thread_info *thr = ecs->event_thread;
+ struct thread_info *thr = ecs.event_thread;
delete_just_stopped_threads_infrun_breakpoints ();
@@ -4243,7 +4230,7 @@ fetch_inferior_event ()
if (!should_stop)
{
- keep_going (ecs);
+ keep_going (&ecs);
}
else
{
@@ -4252,7 +4239,7 @@ fetch_inferior_event ()
stop_all_threads_if_all_stop_mode ();
- clean_up_just_stopped_threads_fsms (ecs);
+ clean_up_just_stopped_threads_fsms (&ecs);
if (thr != nullptr && thr->thread_fsm () != nullptr)
should_notify_stop
@@ -4281,7 +4268,7 @@ fetch_inferior_event ()
selected.". */
if (!non_stop
&& cmd_done
- && ecs->ws.kind () != TARGET_WAITKIND_NO_RESUMED)
+ && ecs.ws.kind () != TARGET_WAITKIND_NO_RESUMED)
restore_thread.dont_restore ();
}
}
@@ -5977,14 +5964,11 @@ restart_threads (struct thread_info *event_thread, inferior *inf)
}
else
{
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
-
infrun_debug_printf ("restart threads: [%s] continuing",
tp->ptid.to_string ().c_str ());
- reset_ecs (ecs, tp);
+ execution_control_state ecs (tp);
switch_to_thread (tp);
- keep_going_pass_signal (ecs);
+ keep_going_pass_signal (&ecs);
}
}
}
@@ -7660,8 +7644,7 @@ restart_after_all_stop_detach (process_stratum_target *proc_target)
if (thr->state != THREAD_RUNNING)
continue;
- execution_control_state ecs;
- reset_ecs (&ecs, thr);
+ execution_control_state ecs (thr);
switch_to_thread (thr);
keep_going (&ecs);
return;
@@ -7676,8 +7659,6 @@ static bool
keep_going_stepped_thread (struct thread_info *tp)
{
frame_info_ptr frame;
- struct execution_control_state ecss;
- struct execution_control_state *ecs = &ecss;
/* If the stepping thread exited, then don't try to switch back and
resume it, which could fail in several different ways depending
@@ -7708,7 +7689,7 @@ keep_going_stepped_thread (struct thread_info *tp)
infrun_debug_printf ("resuming previously stepped thread");
- reset_ecs (ecs, tp);
+ execution_control_state ecs (tp);
switch_to_thread (tp);
tp->set_stop_pc (regcache_read_pc (get_thread_regcache (tp)));
@@ -7757,7 +7738,7 @@ keep_going_stepped_thread (struct thread_info *tp)
{
infrun_debug_printf ("expected thread still hasn't advanced");
- keep_going_pass_signal (ecs);
+ keep_going_pass_signal (&ecs);
}
return true;
--
2.34.3
next reply other threads:[~2022-11-21 17:58 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-21 17:58 Tom Tromey [this message]
2022-11-21 18:14 ` Simon Marchi
2022-11-26 1:53 ` Tom Tromey
2022-11-26 20:32 ` Simon Marchi
2022-11-28 19:19 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221121175830.3585569-1-tom@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).