From: Andrew Burgess <aburgess@redhat.com>
To: gdb-patches@sourceware.org
Cc: Andrew Burgess <aburgess@redhat.com>
Subject: [PATCH 3/3] gdb: add a custom command completer for disassemble command
Date: Fri, 20 Oct 2023 22:33:11 +0100 [thread overview]
Message-ID: <ef8f96939ea8a2f19d455473fb681f25f9b85b75.1697837539.git.aburgess@redhat.com> (raw)
In-Reply-To: <cover.1697837538.git.aburgess@redhat.com>
Add a new command completer function for the disassemble command.
There are two things that this completion function changes. First,
after the previous commit, the new function calls skip_over_slash_fmt,
which means that hitting tab after entering a /OPT flag now inserts a
space ready to start typing the address to disassemble at:
(gdb) disassemble /r<TAB>
(gdb) disassemble /r <CURSOR>
But also, we now get symbol completion after a /OPT option set,
previously this would do nothing:
(gdb) disassemble /r mai<TAB>
But now:
(gdb) disassemble /r mai<TAB>
(gdb) disassemble /r main <CURSOR>
Which was my main motivation for working on this commit.
However, I have made a second change in the completion function.
Currently, the disassemble command calls the generic
location_completer function, however, the disassemble docs say:
Note that the 'disassemble' command's address arguments are specified
using expressions in your programming language (*note Expressions:
Expressions.), not location specs (*note Location Specifications::).
So, for example, if you want to disassemble function 'bar' in file
'foo.c', you must type 'disassemble 'foo.c'::bar' and not 'disassemble
foo.c:bar'.
And indeed, if I try:
(gdb) disassemble hello.c:main
No symbol "hello" in current context.
(gdb) disassemble hello.c::main
No symbol "hello" in current context.
(gdb) disassemble 'hello.c'::main
Dump of assembler code for function main:
... snip ...
But, if I do this:
(gdb) disassemble hell<TAB>
(gdb) disassemble hello.c:<CURSOR>
which is a consequence of using the location_completer function. So
in this commit, after calling skip_over_slash_fmt, I forward the bulk
of the disassemble command completion to expression_completer. Now
when I try this:
(gdb) disassemble hell<TAB>
gives nothing, which I think is an improvement. There is one slight
disappointment, if I do:
(gdb) disassemble 'hell<TAB>
I still get nothing. I had hoped that this would expand to:
'hello.c':: but I guess this is a limitation of the current
expression_completer implementation, however, I don't think this is a
regression, the previous expansion was just wrong. Fixing
expression_completer is out of scope for this commit.
I've added some disassembler command completion tests, and also a test
that disassembling using 'FILE'::FUNC syntax works, as I don't think
that is tested anywhere.
---
gdb/cli/cli-cmds.c | 16 +++++++++++++-
gdb/testsuite/gdb.base/completion.exp | 30 +++++++++++++++++++++++++++
gdb/testsuite/gdb.disasm/basics.exp | 4 ++++
3 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 90989588bab..fd93e5b4ccb 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1698,6 +1698,20 @@ disassemble_command (const char *arg, int from_tty)
print_disassembly (gdbarch, name, low, high, block, flags);
}
+/* Command completion for the disassemble command. */
+
+static void
+disassemble_command_completer (struct cmd_list_element *ignore,
+ completion_tracker &tracker,
+ const char *text, const char * /* word */)
+{
+ if (skip_over_slash_fmt (tracker, &text))
+ return;
+
+ const char *word = advance_to_expression_complete_word_point (tracker, text);
+ expression_completer (ignore, tracker, text, word);
+}
+
static void
make_command (const char *arg, int from_tty)
{
@@ -2855,7 +2869,7 @@ Note that the address is interpreted as an expression, not as a location\n\
like in the \"break\" command.\n\
So, for example, if you want to disassemble function bar in file foo.c\n\
you must type \"disassemble 'foo.c'::bar\" and not \"disassemble foo.c:bar\"."));
- set_cmd_completer (c, location_completer);
+ set_cmd_completer_handle_brkchars (c, disassemble_command_completer);
c = add_com ("make", class_support, make_command, _("\
Run the ``make'' program using the rest of the line as arguments."));
diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp
index 4686e6f8f34..15937810d2f 100644
--- a/gdb/testsuite/gdb.base/completion.exp
+++ b/gdb/testsuite/gdb.base/completion.exp
@@ -975,3 +975,33 @@ test_gdb_complete_unique "xxx_yyy_" "xxx_yyy_zzz"
gdb_test_no_output "alias set aaa_bbb_ccc=set debug"
gdb_test_no_output "maint deprecate set aaa_bbb_ccc"
test_gdb_complete_unique "set aaa_bbb_" "set aaa_bbb_ccc"
+
+# Test command completion for the disassemble command.
+test_gdb_complete_unique \
+ "disassemble multi_line_if" \
+ "disassemble multi_line_if_conditional"
+
+test_gdb_complete_multiple "disassemble " \
+ "multi_li" "ne_" {
+ "multi_line_if_conditional"
+ "multi_line_while_conditional"
+ }
+
+foreach_with_prefix spc { " " "" } {
+ test_gdb_complete_none "disassemble${spc}/"
+
+ foreach_with_prefix flg { "r" "b" "rb" "s" "m" "ms" } {
+ test_gdb_complete_unique "disassemble${spc}/${flg}" \
+ "disassemble${spc}/${flg}"
+
+ test_gdb_complete_unique \
+ "disassemble${spc}/${flg} multi_line_if" \
+ "disassemble${spc}/${flg} multi_line_if_conditional"
+
+ test_gdb_complete_multiple "disassemble${spc}/${flg} " \
+ "multi_li" "ne_" {
+ "multi_line_if_conditional"
+ "multi_line_while_conditional"
+ }
+ }
+}
diff --git a/gdb/testsuite/gdb.disasm/basics.exp b/gdb/testsuite/gdb.disasm/basics.exp
index 78df18d9e96..3dfc16e04cf 100644
--- a/gdb/testsuite/gdb.disasm/basics.exp
+++ b/gdb/testsuite/gdb.disasm/basics.exp
@@ -37,3 +37,7 @@ gdb_test "disassemble /rb main" \
"Cannot specify both /r and /b\\."
gdb_test "disassemble /br main" \
"Cannot specify both /r and /b\\."
+
+# Check disassembly using 'FILE'::FUNC syntax.
+gdb_test "disassemble '$srcfile'::main" \
+ "Dump of assembler code for function main:.*End of assembler dump\\."
--
2.25.4
next prev parent reply other threads:[~2023-10-20 21:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-20 21:33 [PATCH 0/3] Improve disassemble command completion Andrew Burgess
2023-10-20 21:33 ` [PATCH 1/3] gdb: error if /r and /b are used with disassemble command Andrew Burgess
2023-10-21 7:22 ` Eli Zaretskii
2023-10-20 21:33 ` [PATCH 2/3] gdb: make skip_over_slash_fmt available outside printcmd.c Andrew Burgess
2023-10-20 21:33 ` Andrew Burgess [this message]
2023-11-08 11:21 ` [PATCH 0/3] Improve disassemble command completion Andrew Burgess
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=ef8f96939ea8a2f19d455473fb681f25f9b85b75.1697837539.git.aburgess@redhat.com \
--to=aburgess@redhat.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