* [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp
@ 2024-09-05 4:42 Thiago Jung Bauermann
2024-09-05 5:56 ` Eli Zaretskii
2024-09-23 18:47 ` Tom Tromey
0 siblings, 2 replies; 4+ messages in thread
From: Thiago Jung Bauermann @ 2024-09-05 4:42 UTC (permalink / raw)
To: gdb-patches; +Cc: Andrew Burgess
One thing GDB always does when the inferior stops is finding out where
it's stopped at, by way of querying the value of the program counter
register.
To save a packet round trip, the remote target can send the PC
value (often alongside other frequently consulted registers such as the
stack pointer) in the stop reply packet as an "expedited register".
Test that this is actually done for the targets where gdbserver is
supposed to.
Extend the "maintenance print remote-registers" command output with an
"Expedited" column which says "yes" if the register was seen by GDB in
the last stop reply packet it received, and is left blank otherwise.
Tested for regressions on aarch64-linux-gnu native-extended-remote.
The testcase was tested on aarch64-linux-gnu, i686-linux-gnu and
x86_64-linux-gnu native-remote and native-extended-remote targets.
---
gdb/NEWS | 7 ++++++
gdb/doc/gdb.texinfo | 6 ++++-
gdb/regcache-dump.c | 19 +++++++++-----
gdb/remote.c | 27 +++++++++++++++++++-
gdb/remote.h | 5 ++++
gdb/testsuite/gdb.server/server-run.exp | 33 +++++++++++++++++++++++++
6 files changed, 89 insertions(+), 8 deletions(-)
Changes in v2:
- Added NEWS entry and updated documentation for maint print
remote-registers command (suggested by Andrew).
- Updated help string for maint print remote-registers command.
- Adopted Andrew's gdb_test_multiple invocation to avoid leaving unmatched
ouptut in Expect's buffer.
v1 is here:
https://inbox.sourceware.org/gdb-patches/20240831005607.2478217-2-thiago.bauermann@linaro.org/
diff --git a/gdb/NEWS b/gdb/NEWS
index 2f5d5ebbcef1..8820fadb6436 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -40,6 +40,13 @@
history has been reached. It also specifies that the forward execution can
continue, and the recording will also continue.
+* Changed commands
+
+maintenance print remote-registers
+ Add an "Expedited" column to the output of the command. It indicates
+ which registers were included in the last stop reply packet received by
+ GDB.
+
* New commands
maintenance info inline-frames [ADDRESS]
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 8cde2f22637b..26c7b609f86f 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -42048,7 +42048,11 @@ including registers which aren't available on the target nor visible
to user; the command @code{maint print register-groups} includes the
groups that each register is a member of; and the command @code{maint
print remote-registers} includes the remote target's register numbers
-and offsets in the `G' packets.
+and offsets in the `G' packets, as well as an indication of which
+registers were included in the last stop reply packet received by
+@value{GDBN} (@pxref{Stop Reply Packets}). Please note that the list
+of registers included in a stop reply can change from one stop to the
+next.
These commands take an optional parameter, a file name to which to
write the information.
diff --git a/gdb/regcache-dump.c b/gdb/regcache-dump.c
index bc665dc08a67..6b711bf6c2a0 100644
--- a/gdb/regcache-dump.c
+++ b/gdb/regcache-dump.c
@@ -162,7 +162,7 @@ class register_dump_remote : public register_dump
{
if (regnum < 0)
{
- gdb_printf (file, "Rmt Nr g/G Offset");
+ gdb_printf (file, "Rmt Nr g/G Offset Expedited");
}
else if (regnum < gdbarch_num_regs (m_gdbarch))
{
@@ -170,7 +170,12 @@ class register_dump_remote : public register_dump
if (remote_register_number_and_offset (m_gdbarch, regnum,
&pnum, &poffset))
- gdb_printf (file, "%7d %11d", pnum, poffset);
+ {
+ if (remote_register_is_expedited (regnum))
+ gdb_printf (file, "%7d %11d yes", pnum, poffset);
+ else
+ gdb_printf (file, "%7d %11d", pnum, poffset);
+ }
}
}
};
@@ -324,9 +329,11 @@ _initialize_regcache_dump ()
"Takes an optional file parameter."),
&maintenanceprintlist);
add_cmd ("remote-registers", class_maintenance,
- maintenance_print_remote_registers, _("\
-Print the internal register configuration including remote register number "
-"and g/G packets offset.\n\
-Takes an optional file parameter."),
+ maintenance_print_remote_registers,
+ _("Print the internal register configuration including remote "
+ "register number and g/G packets offset.\n"
+ "Also prints which registers were sent in the last stop reply "
+ "packet (i.e. expedited).\n"
+ "Takes an optional file parameter."),
&maintenanceprintlist);
}
diff --git a/gdb/remote.c b/gdb/remote.c
index 2c3988cb5075..c17572d51c8d 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -693,6 +693,10 @@ class remote_state
qSupported. */
gdb_thread_options supported_thread_options = 0;
+ /* Contains the regnums of the expedited registers in the last stop
+ reply packet. */
+ std::set<int> last_seen_expedited_registers;
+
private:
/* Asynchronous signal handle registered as event loop source for
when we have pending events ready to be passed to the core. */
@@ -1490,6 +1494,20 @@ is_remote_target (process_stratum_target *target)
return as_remote_target (target) != nullptr;
}
+/* See remote.h. */
+
+bool
+remote_register_is_expedited (int regnum)
+{
+ remote_target *rt = as_remote_target (current_inferior ()->process_target ());
+
+ if (rt == nullptr)
+ return false;
+
+ remote_state *rs = rt->get_remote_state ();
+ return rs->last_seen_expedited_registers.count (regnum) > 0;
+}
+
/* Per-program-space data key. */
static const registry<program_space>::key<char, gdb::xfree_deleter<char>>
remote_pspace_data;
@@ -8518,6 +8536,10 @@ remote_target::process_stop_reply (stop_reply_up stop_reply,
{
*status = stop_reply->ws;
ptid_t ptid = stop_reply->ptid;
+ struct remote_state *rs = get_remote_state ();
+
+ /* Forget about last reply's expedited registers. */
+ rs->last_seen_expedited_registers.clear ();
/* If no thread/process was reported by the stub then select a suitable
thread/process. */
@@ -8544,7 +8566,10 @@ remote_target::process_stop_reply (stop_reply_up stop_reply,
stop_reply->arch);
for (cached_reg_t ® : stop_reply->regcache)
- regcache->raw_supply (reg.num, reg.data.get ());
+ {
+ regcache->raw_supply (reg.num, reg.data.get ());
+ rs->last_seen_expedited_registers.insert (reg.num);
+ }
}
remote_thread_info *remote_thr = get_remote_thread_info (this, ptid);
diff --git a/gdb/remote.h b/gdb/remote.h
index cb0a66da66e5..bfe3c65b4637 100644
--- a/gdb/remote.h
+++ b/gdb/remote.h
@@ -121,4 +121,9 @@ extern void send_remote_packet (gdb::array_view<const char> &buf,
extern bool is_remote_target (process_stratum_target *target);
+/* Return true if REGNUM was returned as an expedited register in the last
+ stop reply we received. */
+
+extern bool remote_register_is_expedited (int regnum);
+
#endif
diff --git a/gdb/testsuite/gdb.server/server-run.exp b/gdb/testsuite/gdb.server/server-run.exp
index 92eb38bd9db0..af5a5f53ca03 100644
--- a/gdb/testsuite/gdb.server/server-run.exp
+++ b/gdb/testsuite/gdb.server/server-run.exp
@@ -52,3 +52,36 @@ if { [istarget *-*-linux*] } {
gdb_breakpoint main
gdb_test "continue" "Breakpoint.* main .*" "continue to main"
+
+if { [istarget "aarch64*-*-*"]
+ || [istarget "arm*-*-*"]
+ || [istarget "csky*-*-*"]
+ || [istarget "loongarch*-*-*"]
+ || [istarget "riscv*-*-*"] } {
+ set pc_regname "pc"
+} elseif { [is_amd64_regs_target] } {
+ set pc_regname "rip"
+} elseif { [is_x86_like_target] } {
+ set pc_regname "eip"
+} elseif { [istarget "tic6x-*-*"] } {
+ set pc_regname "PC"
+}
+
+# Sending the PC register in advance is good practice. Test that this is
+# actually done for the targets where gdbserver is supposed to.
+set expedited_pc_test_name "send PC as expedited register in stop reply"
+if { [info exists pc_regname] } {
+ set seen_line false
+ gdb_test_multiple "maintenance print remote-registers" \
+ $expedited_pc_test_name -lbl {
+ -re " ${pc_regname}\[\[:space:\]\]+${decimal}.*${decimal} yes" {
+ set seen_line true
+ exp_continue
+ }
+ -re "\r\n$gdb_prompt $" {
+ gdb_assert { $seen_line } $gdb_test_name
+ }
+ }
+} else {
+ untested $expedited_pc_test_name
+}
base-commit: 43af2e08dc0af7796b557d14f13317c0c24f948a
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp
2024-09-05 4:42 [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp Thiago Jung Bauermann
@ 2024-09-05 5:56 ` Eli Zaretskii
2024-09-23 18:47 ` Tom Tromey
1 sibling, 0 replies; 4+ messages in thread
From: Eli Zaretskii @ 2024-09-05 5:56 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: gdb-patches, aburgess
> From: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
> Cc: Andrew Burgess <aburgess@redhat.com>
> Date: Thu, 5 Sep 2024 01:42:02 -0300
>
> gdb/NEWS | 7 ++++++
> gdb/doc/gdb.texinfo | 6 ++++-
> gdb/regcache-dump.c | 19 +++++++++-----
> gdb/remote.c | 27 +++++++++++++++++++-
> gdb/remote.h | 5 ++++
> gdb/testsuite/gdb.server/server-run.exp | 33 +++++++++++++++++++++++++
> 6 files changed, 89 insertions(+), 8 deletions(-)
>
> Changes in v2:
> - Added NEWS entry and updated documentation for maint print
> remote-registers command (suggested by Andrew).
> - Updated help string for maint print remote-registers command.
> - Adopted Andrew's gdb_test_multiple invocation to avoid leaving unmatched
> ouptut in Expect's buffer.
Thanks, the documentation parts are okay.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp
2024-09-05 4:42 [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp Thiago Jung Bauermann
2024-09-05 5:56 ` Eli Zaretskii
@ 2024-09-23 18:47 ` Tom Tromey
2024-09-24 18:22 ` Thiago Jung Bauermann
1 sibling, 1 reply; 4+ messages in thread
From: Tom Tromey @ 2024-09-23 18:47 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: gdb-patches, Andrew Burgess
>>>>> Thiago Jung Bauermann <thiago.bauermann@linaro.org> writes:
> One thing GDB always does when the inferior stops is finding out where
> it's stopped at, by way of querying the value of the program counter
> register.
> To save a packet round trip, the remote target can send the PC
> value (often alongside other frequently consulted registers such as the
> stack pointer) in the stop reply packet as an "expedited register".
> Test that this is actually done for the targets where gdbserver is
> supposed to.
Thanks for the patch.
> @@ -162,7 +162,7 @@ class register_dump_remote : public register_dump
> {
> if (regnum < 0)
> {
> - gdb_printf (file, "Rmt Nr g/G Offset");
> + gdb_printf (file, "Rmt Nr g/G Offset Expedited");
Kind of a shame this doesn't use ui-out tables.
Anyway this looks good to me.
Approved-By: Tom Tromey <tom@tromey.com>
Tom
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp
2024-09-23 18:47 ` Tom Tromey
@ 2024-09-24 18:22 ` Thiago Jung Bauermann
0 siblings, 0 replies; 4+ messages in thread
From: Thiago Jung Bauermann @ 2024-09-24 18:22 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches, Andrew Burgess
Hello Tom,
Tom Tromey <tom@tromey.com> writes:
>>>>>> Thiago Jung Bauermann <thiago.bauermann@linaro.org> writes:
>
>> One thing GDB always does when the inferior stops is finding out where
>> it's stopped at, by way of querying the value of the program counter
>> register.
>
>> To save a packet round trip, the remote target can send the PC
>> value (often alongside other frequently consulted registers such as the
>> stack pointer) in the stop reply packet as an "expedited register".
>
>> Test that this is actually done for the targets where gdbserver is
>> supposed to.
>
> Thanks for the patch.
>
>> @@ -162,7 +162,7 @@ class register_dump_remote : public register_dump
>> {
>> if (regnum < 0)
>> {
>> - gdb_printf (file, "Rmt Nr g/G Offset");
>> + gdb_printf (file, "Rmt Nr g/G Offset Expedited");
>
> Kind of a shame this doesn't use ui-out tables.
>
> Anyway this looks good to me.
> Approved-By: Tom Tromey <tom@tromey.com>
Thank you! Pushed as commit 94aedcf7ea5b.
--
Thiago
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-09-24 18:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-05 4:42 [PATCH v2] gdb: testsuite: Test whether PC register is expedited in gdb.server/server-run.exp Thiago Jung Bauermann
2024-09-05 5:56 ` Eli Zaretskii
2024-09-23 18:47 ` Tom Tromey
2024-09-24 18:22 ` Thiago Jung Bauermann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox