From: Andrew Burgess <andrew.burgess@embecosm.com>
To: Lancelot SIX <lsix@lancelotsix.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 3/3] Add completer to the add-inferior command
Date: Tue, 16 Feb 2021 17:04:52 +0000 [thread overview]
Message-ID: <20210216170452.GR265215@embecosm.com> (raw)
In-Reply-To: <20210213220752.32581-4-lsix@lancelotsix.com>
* Lancelot SIX via Gdb-patches <gdb-patches@sourceware.org> [2021-02-13 22:07:52 +0000]:
> This commit adds a completer to the add-inferior command. Argument
> parsing is also updated to benefit from what is offered by the
> gdb::option framework.
>
> gdb/Changelog:
>
> * inferior.c (struct add_inferior_options): Add struct.
> (add_inferior_options_defs): Create.
> (make_add_inferior_options_def_group): Create.
> (add_inferior_completer): Create.
> (add_inferior_command): Use gdb::option parsing for arguments.
> (initialize_inferiors): Use new completer for add-inferior
> command.
>
> gdb/testsuite/ChangeLog:
>
> * gdb.base/completion.exp: Test add-completion completion.
> ---
> gdb/inferior.c | 123 ++++++++++++++++++--------
> gdb/testsuite/gdb.base/completion.exp | 11 +++
> 2 files changed, 96 insertions(+), 38 deletions(-)
>
> diff --git a/gdb/inferior.c b/gdb/inferior.c
> index 49f869a4c78..6993d043a57 100644
> --- a/gdb/inferior.c
> +++ b/gdb/inferior.c
> @@ -788,63 +788,110 @@ switch_to_inferior_and_push_target (inferior *new_inf,
> printf_filtered (_("Added inferior %d\n"), new_inf->num);
> }
>
> +/* Describes the options for the add-inferior command. */
> +
> +struct add_inferior_options
> +{
> + /* Number new inferiors to create. */
> + unsigned int copies = 1;
> +
> + /* Instructs to start the inferior with no target connected. */
> + bool no_connection = false;
> +
> + /* Path to the file name of the executable to use as main program. */
> + char *exec = nullptr;
> +
> + ~add_inferior_options ()
> + {
> + if (exec != nullptr)
> + {
> + xfree (exec);
> + exec = nullptr;
> + }
> + }
> +};
> +
> +/* Definition of options for the 'add-inferior' command. */
> +
> +static const gdb::option::option_def add_inferior_options_defs[] = {
> + gdb::option::zuinteger_option_def<add_inferior_options> {
> + "copies",
> + [] (add_inferior_options *opt) { return &opt->copies; },
> + nullptr, /* show_cmd_cb */
> + nullptr, /* set_doc */
> + nullptr, /* show_doc */
> + nullptr, /* help_doc */
> + },
> +
> + gdb::option::flag_option_def<add_inferior_options> {
> + "no-connection",
> + [] (add_inferior_options *opt) { return &opt->no_connection; },
> + nullptr, /* set_doc */
> + nullptr, /* help_doc */
> + },
> +
> + gdb::option::filename_option_def<add_inferior_options> {
> + "exec",
> + [] (add_inferior_options *opt) { return &opt->exec; },
> + nullptr, /* show_cmd_cb */
> + nullptr, /* set_doc */
> + nullptr, /* show_doc */
> + nullptr, /* help_doc */
> + },
> +
> +};
> +
> +static gdb::option::option_def_group
> +make_add_inferior_options_def_group (struct add_inferior_options *opts)
> +{
> + return {{add_inferior_options_defs}, opts};
> +}
> +
> +/* Completer for the add-inferior command. */
> +
> +static void
> +add_inferior_completer (struct cmd_list_element *cmd,
> + completion_tracker &tracker,
> + const char *text, const char * /*word*/)
> +{
> + const auto group = make_add_inferior_options_def_group (nullptr);
> + if (gdb::option::complete_options
> + (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
> + return;
> +}
> +
> /* add-inferior [-copies N] [-exec FILENAME] [-no-connection] */
>
> static void
> add_inferior_command (const char *args, int from_tty)
> {
> - int i, copies = 1;
> + int i;
> gdb::unique_xmalloc_ptr<char> exec;
> symfile_add_flags add_flags = 0;
> - bool no_connection = false;
> +
> + add_inferior_options opts;
> + const gdb::option::option_def_group group
> + = make_add_inferior_options_def_group (&opts);
> + gdb::option::process_options
> + (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, group);
>
> if (from_tty)
> add_flags |= SYMFILE_VERBOSE;
>
> - if (args)
> - {
> - gdb_argv built_argv (args);
> -
> - for (char **argv = built_argv.get (); *argv != NULL; argv++)
> - {
> - if (**argv == '-')
> - {
> - if (strcmp (*argv, "-copies") == 0)
> - {
> - ++argv;
> - if (!*argv)
> - error (_("No argument to -copies"));
> - copies = parse_and_eval_long (*argv);
> - }
> - else if (strcmp (*argv, "-no-connection") == 0)
> - no_connection = true;
> - else if (strcmp (*argv, "-exec") == 0)
> - {
> - ++argv;
> - if (!*argv)
> - error (_("No argument to -exec"));
> - exec.reset (tilde_expand (*argv));
> - }
> - }
> - else
> - error (_("Invalid argument"));
> - }
> - }
> -
> inferior *orginf = current_inferior ();
>
> scoped_restore_current_pspace_and_thread restore_pspace_thread;
>
> - for (i = 0; i < copies; ++i)
> + for (i = 0; i < opts.copies; ++i)
> {
> inferior *inf = add_inferior_with_spaces ();
>
> - switch_to_inferior_and_push_target (inf, no_connection, orginf);
> + switch_to_inferior_and_push_target (inf, opts.no_connection, orginf);
>
> - if (exec != NULL)
> + if (opts.filename != nullptr)
> {
> - exec_file_attach (exec.get (), from_tty);
> - symbol_file_add_main (exec.get (), add_flags);
> + exec_file_attach (opts.filename, from_tty);
> + symbol_file_add_main (opts.filename, add_flags);
This patch doesn't build for me as opts.filename is unknown. Did you
mean opts.exec maybe?
Thanks,
Andrew
> }
> }
> }
> @@ -997,7 +1044,7 @@ as main program.\n\
> By default, the new inferior inherits the current inferior's connection.\n\
> If -no-connection is specified, the new inferior begins with\n\
> no target connection yet."));
> - set_cmd_completer (c, filename_completer);
> + set_cmd_completer_handle_brkchars (c, add_inferior_completer);
>
> add_com ("remove-inferiors", no_class, remove_inferior_command, _("\
> Remove inferior ID (or list of IDs).\n\
> diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp
> index 076134cdc33..c83aa8994e2 100644
> --- a/gdb/testsuite/gdb.base/completion.exp
> +++ b/gdb/testsuite/gdb.base/completion.exp
> @@ -980,3 +980,14 @@ 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 the completer of the add-inferior command.
> +gdb_test_no_output "set max-completions unlimited"
> +test_gdb_complete_multiple "add-inferior " "-" "" {
> + "-copies"
> + "-exec"
> + "-no-connection"
> +}
> +test_gdb_complete_unique \
> + "add-inferior -copies 2 -exec some\\ file -n" \
> + "add-inferior -copies 2 -exec some\\ file -no-connection"
> --
> 2.29.2
>
next prev parent reply other threads:[~2021-02-16 17:05 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-13 22:07 [PATCH 0/3] Improve the add-inferior completer Lancelot SIX via Gdb-patches
2021-02-13 22:07 ` [PATCH 1/3] gdb::option: Add support for filename option Lancelot SIX via Gdb-patches
2021-02-16 17:45 ` Andrew Burgess
2021-02-16 18:52 ` Lancelot SIX via Gdb-patches
2021-02-17 10:20 ` Andrew Burgess
2021-02-13 22:07 ` [PATCH 2/3] gdb::option: Add support for zuinteger Lancelot SIX via Gdb-patches
2021-02-13 22:07 ` [PATCH 3/3] Add completer to the add-inferior command Lancelot SIX via Gdb-patches
2021-02-16 17:04 ` Andrew Burgess [this message]
2021-02-16 18:10 ` Lancelot SIX via Gdb-patches
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=20210216170452.GR265215@embecosm.com \
--to=andrew.burgess@embecosm.com \
--cc=gdb-patches@sourceware.org \
--cc=lsix@lancelotsix.com \
/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