binutils-gdb/gdb/maint-test-options.c

502 lines
16 KiB
C
Raw Normal View History

Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
/* Maintenance commands for testing the options framework.
Copyright (C) 2019 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdbcmd.h"
#include "cli/cli-option.h"
/* This file defines three "maintenance test-options" subcommands to
exercise TAB-completion and option processing:
(gdb) maint test-options require-delimiter
(gdb) maint test-options unknown-is-error
(gdb) maint test-options unknown-is-operand
And a fourth one to help with TAB-completion testing.
(gdb) maint show test-options-completion-result
Each of the test-options subcommands exercise
gdb::option::process_options with a different enum
process_options_mode value. Examples for commands they model:
- "print" and "compile print", are like "require-delimiter",
because they accept random expressions as argument.
- "backtrace" and "frame/thread apply" are like
"unknown-is-operand", because "-" is a valid command.
- "compile file" and "compile code" are like "unknown-is-error".
These commands allow exercising all aspects of option processing
without having to pick some existing command. That should be more
stable going forward than relying on an existing user command,
since if we picked say "print", that command or its options could
change in future, and then we'd be left with having to pick some
other command or option to exercise some non-command-specific
option processing detail. Also, actual user commands have side
effects that we're not interested in when we're focusing on unit
testing the options machinery. BTW, a maintenance command is used
as a sort of unit test driver instead of actual "maint selftest"
unit tests, since we need to go all the way via gdb including
readline, for proper testing of TAB completion.
These maintenance commands support options of all the different
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
available kinds of commands (boolean, enum, flag, string, uinteger):
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
(gdb) maint test-options require-delimiter -[TAB]
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
-bool -enum -flag -string -uinteger -xx1 -xx2
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
(gdb) maint test-options require-delimiter -bool o[TAB]
off on
(gdb) maint test-options require-delimiter -enum [TAB]
xxx yyy zzz
(gdb) maint test-options require-delimiter -uinteger [TAB]
NUMBER unlimited
'-xx1' and '-xx2' are flag options too. They exist in order to
test ambiguous option names, like '-xx'.
Invoking the commands makes them print out the options parsed:
(gdb) maint test-options unknown-is-error -flag -enum yyy cmdarg
-flag 1 -xx1 0 -xx2 0 -bool 0 -enum yyy -uint 0 -zuint-unl 0 -- cmdarg
(gdb) maint test-options require-delimiter -flag -enum yyy cmdarg
-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -- -flag -enum yyy cmdarg
(gdb) maint test-options require-delimiter -flag -enum yyy cmdarg --
Unrecognized option at: cmdarg --
(gdb) maint test-options require-delimiter -flag -enum yyy -- cmdarg
-flag 1 -xx1 0 -xx2 0 -bool 0 -enum yyy -uint 0 -zuint-unl 0 -- cmdarg
The "maint show test-options-completion-result" command exists in
order to do something similar for completion:
(gdb) maint test-options unknown-is-error -flag -b 0 -enum yyy OPERAND[TAB]
(gdb) maint show test-options-completion-result
0 OPERAND
(gdb) maint test-options unknown-is-error -flag -b 0 -enum yyy[TAB]
(gdb) maint show test-options-completion-result
1
(gdb) maint test-options require-dash -unknown[TAB]
(gdb) maint show test-options-completion-result
1
Here, "1" means the completion function processed the whole input
line, and that the command shouldn't do anything with the arguments,
since there are no operands. While "0" indicates that there are
operands after options. The text after "0" is the operands.
This level of detail is particularly important because getting the
completion function's entry point to return back to the caller the
right pointer into the operand is quite tricky in several
scenarios. */
/* Enum values for the "maintenance test-options" commands. */
const char test_options_enum_values_xxx[] = "xxx";
const char test_options_enum_values_yyy[] = "yyy";
const char test_options_enum_values_zzz[] = "zzz";
static const char *const test_options_enum_values_choices[] =
{
test_options_enum_values_xxx,
test_options_enum_values_yyy,
test_options_enum_values_zzz,
NULL
};
/* Option data for the "maintenance test-options" commands. */
struct test_options_opts
{
Change boolean options to bool instead of int This is for add_setshow_boolean_cmd as well as the gdb::option interface. gdb/ChangeLog: 2019-09-17 Christian Biesinger <cbiesinger@google.com> * ada-lang.c (ada_ignore_descriptive_types_p): Change to bool. (print_signatures): Likewise. (trust_pad_over_xvs): Likewise. * arch/aarch64-insn.c (aarch64_debug): Likewise. * arch/aarch64-insn.h (aarch64_debug): Likewise. * arm-linux-nat.c (arm_apcs_32): Likewise. * arm-linux-tdep.c (arm_apcs_32): Likewise. * arm-nbsd-nat.c (arm_apcs_32): Likewise. * arm-tdep.c (arm_debug): Likewise. (arm_apcs_32): Likewise. * auto-load.c (debug_auto_load): Likewise. (auto_load_gdb_scripts): Likewise. (global_auto_load): Likewise. (auto_load_local_gdbinit): Likewise. (auto_load_local_gdbinit_loaded): Likewise. * auto-load.h (global_auto_load): Likewise. (auto_load_local_gdbinit): Likewise. (auto_load_local_gdbinit_loaded): Likewise. * breakpoint.c (disconnected_dprintf): Likewise. (breakpoint_proceeded): Likewise. (automatic_hardware_breakpoints): Likewise. (always_inserted_mode): Likewise. (target_exact_watchpoints): Likewise. (_initialize_breakpoint): Update. * breakpoint.h (target_exact_watchpoints): Change to bool. * btrace.c (maint_btrace_pt_skip_pad): Likewise. * cli/cli-cmds.c (trace_commands): Likewise. * cli/cli-cmds.h (trace_commands): Likewise. * cli/cli-decode.c (add_setshow_boolean_cmd): Change int* argument to bool*. * cli/cli-logging.c (logging_overwrite): Change to bool. (logging_redirect): Likewise. (debug_redirect): Likewise. * cli/cli-option.h (option_def) <boolean>: Change return type to bool*. (struct boolean_option_def) <get_var_address_cb_>: Change return type to bool. <boolean_option_def>: Update. (struct flag_option_def): Change default type of Context to bool from int. <flag_option_def>: Change return type of var_address_cb_ to bool*. * cli/cli-setshow.c (do_set_command): Cast to bool* instead of int*. (get_setshow_command_value_string): Likewise. * cli/cli-style.c (cli_styling): Change to bool. (source_styling): Likewise. * cli/cli-style.h (source_styling): Likewise. (cli_styling): Likewise. * cli/cli-utils.h (struct qcs_flags) <quiet, cont, silent>: Change to bool. * command.h (var_types): Update comment. (add_setshow_boolean_cmd): Change int* var argument to bool*. * compile/compile-cplus-types.c (debug_compile_cplus_types): Change to bool. (debug_compile_cplus_scopes): Likewise. * compile/compile-internal.h (compile_debug): Likewise. * compile/compile.c (compile_debug): Likewise. (struct compile_options) <raw>: Likewise. * cp-support.c (catch_demangler_crashes): Likewise. * cris-tdep.c (usr_cmd_cris_version_valid): Likewise. (usr_cmd_cris_dwarf2_cfi): Likewise. * csky-tdep.c (csky_debug): Likewise. * darwin-nat.c (enable_mach_exceptions): Likewise. * dcache.c (dcache_enabled_p): Likewise. * defs.h (info_verbose): Likewise. * demangle.c (demangle): Likewise. (asm_demangle): Likewise. * dwarf-index-cache.c (debug_index_cache): Likewise. * dwarf2-frame.c (dwarf2_frame_unwinders_enabled_p): Likewise. * dwarf2-frame.h (dwarf2_frame_unwinders_enabled_p): Likewise. * dwarf2read.c (check_physname): Likewise. (use_deprecated_index_sections): Likewise. (dwarf_always_disassemble): Likewise. * eval.c (overload_resolution): Likewise. * event-top.c (set_editing_cmd_var): Likewise. (exec_done_display_p): Likewise. * event-top.h (set_editing_cmd_var): Likewise. (exec_done_display_p): Likewise. * exec.c (write_files): Likewise. * fbsd-nat.c (debug_fbsd_lwp): Likewise (debug_fbsd_nat): Likewise. * frame.h (struct frame_print_options) <print_raw_frame_arguments>: Likewise. (struct set_backtrace_options) <backtrace_past_main>: Likewise. <backtrace_past_entry> Likewise. * gdb-demangle.h (demangle): Likewise. (asm_demangle): Likewise. * gdb_bfd.c (bfd_sharing): Likewise. * gdbcore.h (write_files): Likewise. * gdbsupport/common-debug.c (show_debug_regs): Likewise. * gdbsupport/common-debug.h (show_debug_regs): Likewise. * gdbthread.h (print_thread_events): Likewise. * gdbtypes.c (opaque_type_resolution): Likewise. (strict_type_checking): Likewise. * gnu-nat.c (gnu_debug_flag): Likewise. * guile/scm-auto-load.c (auto_load_guile_scripts): Likewise. * guile/scm-param.c (pascm_variable): Add boolval. (add_setshow_generic): Update. (pascm_param_value): Update. (pascm_set_param_value_x): Update. * hppa-tdep.c (hppa_debug): Change to bool.. * infcall.c (may_call_functions_p): Likewise. (coerce_float_to_double_p): Likewise. (unwind_on_signal_p): Likewise. (unwind_on_terminating_exception_p): Likewise. * infcmd.c (startup_with_shell): Likewise. * inferior.c (print_inferior_events): Likewise. * inferior.h (startup_with_shell): Likewise. (print_inferior_events): Likewise. * infrun.c (step_stop_if_no_debug): Likewise. (detach_fork): Likewise. (debug_displaced): Likewise. (disable_randomization): Likewise. (non_stop): Likewise. (non_stop_1): Likewise. (observer_mode): Likewise. (observer_mode_1): Likewise. (set_observer_mode): Update. (sched_multi): Change to bool. * infrun.h (debug_displaced): Likewise. (sched_multi): Likewise. (step_stop_if_no_debug): Likewise. (non_stop): Likewise. (disable_randomization): Likewise. * linux-tdep.c (use_coredump_filter): Likewise. (dump_excluded_mappings): Likewise. * linux-thread-db.c (auto_load_thread_db): Likewise. (check_thread_db_on_load): Likewise. * main.c (captured_main_1): Update. * maint-test-options.c (struct test_options_opts) <flag_opt, xx1_opt, xx2_opt, boolean_opt>: Change to bool. * maint-test-settings.c (maintenance_test_settings_boolean): Likewise. * maint.c (maintenance_profile_p): Likewise. (per_command_time): Likewise. (per_command_space): Likewise. (per_command_symtab): Likewise. * memattr.c (inaccessible_by_default): Likewise. * mi/mi-main.c (mi_async): Likewise. (mi_async_1): Likewise. * mips-tdep.c (mips64_transfers_32bit_regs_p): Likewise. * nat/fork-inferior.h (startup_with_shell): Likewise. * nat/linux-namespaces.c (debug_linux_namespaces): Likewise. * nat/linux-namespaces.h (debug_linux_namespaces): Likewise. * nios2-tdep.c (nios2_debug): Likewise. * or1k-tdep.c (or1k_debug): Likewise. * parse.c (parser_debug): Likewise. * parser-defs.h (parser_debug): Likewise. * printcmd.c (print_symbol_filename): Likewise. * proc-api.c (procfs_trace): Likewise. * python/py-auto-load.c (auto_load_python_scripts): Likewise. * python/py-param.c (union parmpy_variable): Add "bool boolval" field. (set_parameter_value): Update. (add_setshow_generic): Update. * python/py-value.c (copy_py_bool_obj): Change argument from int* to bool*. * python/python.c (gdbpy_parameter_value): Cast to bool* instead of int*. * ravenscar-thread.c (ravenscar_task_support): Change to bool. * record-btrace.c (record_btrace_target::store_registers): Update. * record-full.c (record_full_memory_query): Change to bool. (record_full_stop_at_limit): Likewise. * record-full.h (record_full_memory_query): Likewise. * remote-notif.c (notif_debug): Likewise. * remote-notif.h (notif_debug): Likewise. * remote.c (use_range_stepping): Likewise. (interrupt_on_connect): Likewise. (remote_break): Likewise. * ser-tcp.c (tcp_auto_retry): Likewise. * ser-unix.c (serial_hwflow): Likewise. * skip.c (debug_skip): Likewise. * solib-aix.c (solib_aix_debug): Likewise. * spu-tdep.c (spu_stop_on_load_p): Likewise. (spu_auto_flush_cache_p): Likewise. * stack.c (struct backtrace_cmd_options) <full, no_filters, hide>: Likewise. (struct info_print_options) <quiet>: Likewise. * symfile-debug.c (debug_symfile): Likewise. * symfile.c (auto_solib_add): Likewise. (separate_debug_file_debug): Likewise. * symfile.h (auto_solib_add): Likewise. (separate_debug_file_debug): Likewise. * symtab.c (basenames_may_differ): Likewise. (struct filename_partial_match_opts) <dirname, basename>: Likewise. (struct info_print_options) <quiet, exclude_minsyms>: Likewise. (struct info_types_options) <quiet>: Likewise. * symtab.h (demangle): Likewise. (basenames_may_differ): Likewise. * target-dcache.c (stack_cache_enabled_1): Likewise. (code_cache_enabled_1): Likewise. * target.c (trust_readonly): Likewise. (may_write_registers): Likewise. (may_write_memory): Likewise. (may_insert_breakpoints): Likewise. (may_insert_tracepoints): Likewise. (may_insert_fast_tracepoints): Likewise. (may_stop): Likewise. (auto_connect_native_target): Likewise. (target_stop_and_wait): Update. (target_async_permitted): Change to bool. (target_async_permitted_1): Likewise. (may_write_registers_1): Likewise. (may_write_memory_1): Likewise. (may_insert_breakpoints_1): Likewise. (may_insert_tracepoints_1): Likewise. (may_insert_fast_tracepoints_1): Likewise. (may_stop_1): Likewise. * target.h (target_async_permitted): Likewise. (may_write_registers): Likewise. (may_write_memory): Likewise. (may_insert_breakpoints): Likewise. (may_insert_tracepoints): Likewise. (may_insert_fast_tracepoints): Likewise. (may_stop): Likewise. * thread.c (struct info_threads_opts) <show_global_ids>: Likewise. (make_thread_apply_all_options_def_group): Change argument from int* to bool*. (thread_apply_all_command): Update. (print_thread_events): Change to bool. * top.c (confirm): Likewise. (command_editing_p): Likewise. (history_expansion_p): Likewise. (write_history_p): Likewise. (info_verbose): Likewise. * top.h (confirm): Likewise. (history_expansion_p): Likewise. * tracepoint.c (disconnected_tracing): Likewise. (circular_trace_buffer): Likewise. * typeprint.c (print_methods): Likewise. (print_typedefs): Likewise. * utils.c (debug_timestamp): Likewise. (sevenbit_strings): Likewise. (pagination_enabled): Likewise. * utils.h (sevenbit_strings): Likewise. (pagination_enabled): Likewise. * valops.c (overload_resolution): Likewise. * valprint.h (struct value_print_options) <prettyformat_arrays, prettyformat_structs, vtblprint, unionprint, addressprint, objectprint, stop_print_at_null, print_array_indexes, deref_ref, static_field_print, pascal_static_field_print, raw, summary, symbol_print, finish_print>: Likewise. * windows-nat.c (new_console): Likewise. (cygwin_exceptions): Likewise. (new_group): Likewise. (debug_exec): Likewise. (debug_events): Likewise. (debug_memory): Likewise. (debug_exceptions): Likewise. (useshell): Likewise. * windows-tdep.c (maint_display_all_tib): Likewise. * xml-support.c (debug_xml): Likewise.
2019-09-15 03:36:58 +08:00
bool flag_opt = false;
bool xx1_opt = false;
bool xx2_opt = false;
bool boolean_opt = false;
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
const char *enum_opt = test_options_enum_values_xxx;
unsigned int uint_opt = 0;
int zuint_unl_opt = 0;
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
char *string_opt = nullptr;
test_options_opts () = default;
DISABLE_COPY_AND_ASSIGN (test_options_opts);
~test_options_opts ()
{
xfree (string_opt);
}
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
/* Dump the options to FILE. ARGS is the remainder unprocessed
arguments. */
void dump (ui_file *file, const char *args) const
{
fprintf_unfiltered (file,
_("-flag %d -xx1 %d -xx2 %d -bool %d "
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
"-enum %s -uint %s -zuint-unl %s -string '%s' -- %s\n"),
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
flag_opt,
xx1_opt,
xx2_opt,
boolean_opt,
enum_opt,
(uint_opt == UINT_MAX
? "unlimited"
: pulongest (uint_opt)),
(zuint_unl_opt == -1
? "unlimited"
: plongest (zuint_unl_opt)),
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
(string_opt != nullptr
? string_opt
: ""),
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
args);
}
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
};
/* Option definitions for the "maintenance test-options" commands. */
static const gdb::option::option_def test_options_option_defs[] = {
/* A flag option. */
gdb::option::flag_option_def<test_options_opts> {
"flag",
[] (test_options_opts *opts) { return &opts->flag_opt; },
N_("A flag option."),
},
/* A couple flags with similar names, for "ambiguous option names"
testing. */
gdb::option::flag_option_def<test_options_opts> {
"xx1",
[] (test_options_opts *opts) { return &opts->xx1_opt; },
N_("A flag option."),
},
gdb::option::flag_option_def<test_options_opts> {
"xx2",
[] (test_options_opts *opts) { return &opts->xx2_opt; },
N_("A flag option."),
},
/* A boolean option. */
gdb::option::boolean_option_def<test_options_opts> {
"bool",
[] (test_options_opts *opts) { return &opts->boolean_opt; },
nullptr, /* show_cmd_cb */
N_("A boolean option."),
},
/* An enum option. */
gdb::option::enum_option_def<test_options_opts> {
"enum",
test_options_enum_values_choices,
[] (test_options_opts *opts) { return &opts->enum_opt; },
nullptr, /* show_cmd_cb */
N_("An enum option."),
},
/* A uinteger option. */
gdb::option::uinteger_option_def<test_options_opts> {
"uinteger",
[] (test_options_opts *opts) { return &opts->uint_opt; },
nullptr, /* show_cmd_cb */
N_("A uinteger option."),
nullptr, /* show_doc */
N_("A help doc that spawns\nmultiple lines."),
},
/* A zuinteger_unlimited option. */
gdb::option::zuinteger_unlimited_option_def<test_options_opts> {
"zuinteger-unlimited",
[] (test_options_opts *opts) { return &opts->zuint_unl_opt; },
nullptr, /* show_cmd_cb */
N_("A zuinteger-unlimited option."),
nullptr, /* show_doc */
nullptr, /* help_doc */
},
Teach gdb::option about string options A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
2019-07-03 23:57:49 +08:00
/* A string option. */
gdb::option::string_option_def<test_options_opts> {
"string",
[] (test_options_opts *opts) { return &opts->string_opt; },
nullptr, /* show_cmd_cb */
N_("A string option."),
},
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
};
/* Create an option_def_group for the test_options_opts options, with
OPTS as context. */
static inline gdb::option::option_def_group
make_test_options_options_def_group (test_options_opts *opts)
{
return {{test_options_option_defs}, opts};
}
/* Implementation of the "maintenance test-options
require-delimiter/unknown-is-error/unknown-is-operand" commands.
Each of the commands maps to a different enum process_options_mode
enumerator. The test strategy is simply processing the options in
a number of scenarios, and printing back the parsed result. */
static void
maintenance_test_options_command_mode (const char *args,
gdb::option::process_options_mode mode)
{
test_options_opts opts;
gdb::option::process_options (&args, mode,
make_test_options_options_def_group (&opts));
if (args == nullptr)
args = "";
else
args = skip_spaces (args);
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
opts.dump (gdb_stdout, args);
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
}
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
/* Variable used by the "maintenance show
test-options-completion-result" command. This variable is stored
by the completer of the "maint test-options" subcommands.
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
If the completer returned false, this includes the text at the word
point after gdb::option::complete_options returns. If true, then
this includes a dump of the processed options. */
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
static std::string maintenance_test_options_command_completion_text;
/* The "maintenance show test-options-completion-result" command. */
static void
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
maintenance_show_test_options_completion_result (const char *args,
int from_tty)
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
{
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
puts_filtered (maintenance_test_options_command_completion_text.c_str ());
}
/* Save the completion result in the global variables read by the
"maintenance test-options require-delimiter" command. */
static void
save_completion_result (const test_options_opts &opts, bool res,
const char *text)
{
if (res)
{
string_file stream;
stream.puts ("1 ");
opts.dump (&stream, text);
maintenance_test_options_command_completion_text
= std::move (stream.string ());
}
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
else
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
{
maintenance_test_options_command_completion_text
= string_printf ("0 %s\n", text);
}
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
}
/* Implementation of completer for the "maintenance test-options
require-delimiter/unknown-is-error/unknown-is-operand" commands.
Each of the commands maps to a different enum process_options_mode
enumerator. */
static void
maintenance_test_options_completer_mode (completion_tracker &tracker,
const char *text,
gdb::option::process_options_mode mode)
{
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
test_options_opts opts;
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
try
{
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
bool res = (gdb::option::complete_options
(tracker, &text, mode,
make_test_options_options_def_group (&opts)));
save_completion_result (opts, res, text);
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
}
catch (const gdb_exception_error &ex)
{
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
save_completion_result (opts, true, text);
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
throw;
}
}
/* Implementation of the "maintenance test-options require-delimiter"
command. */
static void
maintenance_test_options_require_delimiter_command (const char *args,
int from_tty)
{
maintenance_test_options_command_mode
(args, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER);
}
/* Implementation of the "maintenance test-options
unknown-is-error" command. */
static void
maintenance_test_options_unknown_is_error_command (const char *args,
int from_tty)
{
maintenance_test_options_command_mode
(args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR);
}
/* Implementation of the "maintenance test-options
unknown-is-operand" command. */
static void
maintenance_test_options_unknown_is_operand_command (const char *args,
int from_tty)
{
maintenance_test_options_command_mode
(args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND);
}
/* Completer for the "maintenance test-options require-delimiter"
command. */
static void
maintenance_test_options_require_delimiter_command_completer
(cmd_list_element *ignore, completion_tracker &tracker,
const char *text, const char *word)
{
maintenance_test_options_completer_mode
(tracker, text, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER);
}
/* Completer for the "maintenance test-options unknown-is-error"
command. */
static void
maintenance_test_options_unknown_is_error_command_completer
(cmd_list_element *ignore, completion_tracker &tracker,
const char *text, const char *word)
{
maintenance_test_options_completer_mode
(tracker, text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR);
}
/* Completer for the "maintenance test-options unknown-is-operand"
command. */
static void
maintenance_test_options_unknown_is_operand_command_completer
(cmd_list_element *ignore, completion_tracker &tracker,
const char *text, const char *word)
{
maintenance_test_options_completer_mode
(tracker, text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND);
}
/* Command list for maint test-options. */
struct cmd_list_element *maintenance_test_options_list;
/* The "maintenance test-options" prefix command. */
static void
maintenance_test_options_command (const char *arg, int from_tty)
{
printf_unfiltered
(_("\"maintenance test-options\" must be followed "
"by the name of a subcommand.\n"));
help_list (maintenance_test_options_list, "maintenance test-options ",
all_commands, gdb_stdout);
}
void
_initialize_maint_test_options ()
{
cmd_list_element *cmd;
add_prefix_cmd ("test-options", no_class, maintenance_test_options_command,
_("\
Generic command for testing the options infrastructure."),
&maintenance_test_options_list,
"maintenance test-options ", 0,
&maintenancelist);
const auto def_group = make_test_options_options_def_group (nullptr);
static const std::string help_require_delim_str
= gdb::option::build_help (_("\
Command used for testing options processing.\n\
Usage: maint test-options require-delimiter [[OPTION]... --] [OPERAND]...\n\
\n\
Options:\n\
%OPTIONS%\n\
Make first and last lines of 'command help documentation' consistent. With this patch, the help docs now respect 2 invariants: * The first line of a command help is terminated by a '.' character. * The last character of a command help is not a newline character. Note that the changes for the last invariant were done by Tom, as part of : [PATCH] Remove trailing newlines from help text https://sourceware.org/ml/gdb-patches/2019-06/msg00050.html but some occurrences have been re-introduced since then. Some help docs had to be rephrased/restructured to respect the above invariants. Before this patch, print_doc_line was printing the first line of a command help documentation, but stopping at the first '.' or ',' character. This was giving inconsistent results : * The first line of command helps was sometimes '.' terminated, sometimes not. * The first line of command helps was not always designed to be readable/understandable/unambiguous when stopping at the first '.' or ',' character. This e.g. created the following inconsistencies/problems: < catch exception -- Catch Ada exceptions < catch handlers -- Catch Ada exceptions < catch syscall -- Catch system calls by their names < down-silently -- Same as the `down' command while the new help is: > catch exception -- Catch Ada exceptions, when raised. > catch handlers -- Catch Ada exceptions, when handled. > catch syscall -- Catch system calls by their names, groups and/or numbers. > down-silently -- Same as the `down' command, but does not print anything. Also, the command help doc should not be terminated by a newline character, but this was not respected by all commands. The cli-option -OPT framework re-introduced some occurences. So, the -OPT build help framework was changed to not output newlines at the end of %OPTIONS% replacement. This patch changes the help documentations to ensure the 2 invariants given above. It implied to slightly rephrase or restructure some help docs. Based on the above invariants, print_doc_line (called by 'apropos' and 'help' commands to print the first line of a command help) now outputs the full first line of a command help. This all results in a lot of small changes in the produced help docs. There are less code changes than changes in the help docs, as a lot of docs are produced by some code (e.g. the remote packet usage settings). gdb/ChangeLog 2019-08-07 Philippe Waroquiers <philippe.waroquiers@skynet.be> * cli/cli-decode.h (print_doc_line): Add for_value_prefix argument. * cli/cli-decode.c (print_doc_line): Likewise. It now prints the full first line, except when FOR_VALUE_PREFIX. In this case, the trailing '.' is not output, and the first character is uppercased. (print_help_for_command): Update call to print_doc_line. (print_doc_of_command): Likewise. * cli/cli-setshow.c (deprecated_show_value_hack): Likewise. * cli/cli-option.c (append_indented_doc): Do not append newline. (build_help_option): Append newline after first appended_indented_doc only if a second call is done. (build_help): Append 2 new lines before each option, except the first one. * compile/compile.c (_initialize_compile): Add new lines after %OPTIONS%, when not at the end of the help. Change help doc or code producing the help doc to respect the invariants. * maint-test-options.c (_initialize_maint_test_options): Likewise. Also removed the new line after 'Options:', as all other commands do not put an empty line between 'Options:' and the first option. * printcmd.c (_initialize_printcmd): Likewise. * stack.c (_initialize_stack): Likewise. * interps.c (interpreter_exec_cmd): Fix "Usage:" line that was incorrectly telling COMMAND is optional. * ada-lang.c (_initialize_ada_language): Change help doc or code producing the help doc to respect the invariants. * ada-tasks.c (_initialize_ada_tasks): Likewise. * breakpoint.c (_initialize_breakpoint): Likewise. * cli/cli-cmds.c (_initialize_cli_cmds): Likewise. * cli/cli-logging.c (_initialize_cli_logging): Likewise. * cli/cli-setshow.c (_initialize_cli_setshow): Likewise. * cli/cli-style.c (cli_style_option::add_setshow_commands, _initialize_cli_style): Likewise. * corelow.c (core_target_info): Likewise. * dwarf-index-cache.c (_initialize_index_cache): Likewise. * dwarf2read.c (_initialize_dwarf2_read): Likewise. * filesystem.c (_initialize_filesystem): Likewise. * frame.c (_initialize_frame): Likewise. * gnu-nat.c (add_task_commands): Likewise. * infcall.c (_initialize_infcall): Likewise. * infcmd.c (_initialize_infcmd): Likewise. * interps.c (_initialize_interpreter): Likewise. * language.c (_initialize_language): Likewise. * linux-fork.c (_initialize_linux_fork): Likewise. * maint-test-settings.c (_initialize_maint_test_settings): Likewise. * maint.c (_initialize_maint_cmds): Likewise. * memattr.c (_initialize_mem): Likewise. * printcmd.c (_initialize_printcmd): Likewise. * python/lib/gdb/function/strfns.py (_MemEq, _StrLen, _StrEq, _RegEx): Likewise. * ravenscar-thread.c (_initialize_ravenscar): Likewise. * record-btrace.c (_initialize_record_btrace): Likewise. * record-full.c (_initialize_record_full): Likewise. * record.c (_initialize_record): Likewise. * regcache-dump.c (_initialize_regcache_dump): Likewise. * regcache.c (_initialize_regcache): Likewise. * remote.c (add_packet_config_cmd, init_remote_threadtests, _initialize_remote): Likewise. * ser-tcp.c (_initialize_ser_tcp): Likewise. * serial.c (_initialize_serial): Likewise. * skip.c (_initialize_step_skip): Likewise. * source.c (_initialize_source): Likewise. * stack.c (_initialize_stack): Likewise. * symfile.c (_initialize_symfile): Likewise. * symtab.c (_initialize_symtab): Likewise. * target-descriptions.c (_initialize_target_descriptions): Likewise. * top.c (init_main): Likewise. * tracefile-tfile.c (tfile_target_info): Likewise. * tracepoint.c (_initialize_tracepoint): Likewise. * tui/tui-win.c (_initialize_tui_win): Likewise. * utils.c (add_internal_problem_command): Likewise. * valprint.c (value_print_option_defs): Likewise. gdb/testsuite/ChangeLog 2019-08-07 Philippe Waroquiers <philippe.waroquiers@skynet.be> * gdb.base/style.exp: Update tests for help doc new invariants. * gdb.base/help.exp: Likewise.
2019-06-09 17:16:20 +08:00
\n\
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
If you specify any command option, you must use a double dash (\"--\")\n\
to mark the end of option processing."),
def_group);
static const std::string help_unknown_is_error_str
= gdb::option::build_help (_("\
Command used for testing options processing.\n\
Usage: maint test-options unknown-is-error [OPTION]... [OPERAND]...\n\
\n\
Options:\n\
%OPTIONS%"),
def_group);
static const std::string help_unknown_is_operand_str
= gdb::option::build_help (_("\
Command used for testing options processing.\n\
Usage: maint test-options unknown-is-operand [OPTION]... [OPERAND]...\n\
\n\
Options:\n\
%OPTIONS%"),
def_group);
cmd = add_cmd ("require-delimiter", class_maintenance,
maintenance_test_options_require_delimiter_command,
help_require_delim_str.c_str (),
&maintenance_test_options_list);
set_cmd_completer_handle_brkchars
(cmd, maintenance_test_options_require_delimiter_command_completer);
cmd = add_cmd ("unknown-is-error", class_maintenance,
maintenance_test_options_unknown_is_error_command,
help_unknown_is_error_str.c_str (),
&maintenance_test_options_list);
set_cmd_completer_handle_brkchars
(cmd, maintenance_test_options_unknown_is_error_command_completer);
cmd = add_cmd ("unknown-is-operand", class_maintenance,
maintenance_test_options_unknown_is_operand_command,
help_unknown_is_operand_str.c_str (),
&maintenance_test_options_list);
set_cmd_completer_handle_brkchars
(cmd, maintenance_test_options_unknown_is_operand_command_completer);
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
add_cmd ("test-options-completion-result", class_maintenance,
maintenance_show_test_options_completion_result,
_("\
Show maintenance test-options completion result.\n\
Shows the results of completing\n\
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
\"maint test-options require-delimiter\",\n\
\"maint test-options unknown-is-error\", or\n\
\"maint test-options unknown-is-operand\"."),
Make gdb::option::complete_options save processed arguments too Currently, gdb::option::complete_options just discards any processed option argument, because no completer needs that data. When completing "pipe -d XXX gdbcmd XXX" however, the completer needs to know about -d's argument (XXX), in order to know where input is already past the gdb command and the delimiter. In this commit, the fix for that is the factoring out of the save_option_value_in_ctx function and calling it in complete_options. For testing, this makes "maint show test-options-completion-result" show the processed options too, like what the "maint test-options" subcommands output when run. Then, of course, gdb.base/options.exp is adjusted. Doing this exposed a couple latent bugs, which is what the other gdb changes in the patch are for: - in the var_enum case, without the change, we'd end up with a null enum argument, and print: "-enum (null)" - The get_ulongest change is necessary to avoid advancing PP in a case where we end up throwing an error, e.g., when parsing "11x". Without the change the operand pointer shown by "maint show test-options-completion-result" would be left pointing at "x" instead of "11x". gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (parse_option) <var_enum>: Don't return an option_value with a null enumeration. (complete_options): Save the option values in the context. (save_option_value_in_ctx): New, factored out from ... (process_options): ... here. * cli/cli-utils.c (get_ulongest): Don't advance PP until the end of the function. * maint-test-options.c (test_options_opts::dump): New, factored out from ... (maintenance_test_options_command_mode): ... here. (maintenance_test_options_command_completion_result): Delete. (maintenance_test_options_command_completion_text): Update comment. (maintenance_show_test_options_completion_result): Change prototype. Just print maintenance_test_options_command_completion_text. (save_completion_result): New. (maintenance_test_options_completer_mode): Pass options context to complete_options, and then save a dump. (_initialize_maint_test_options): Use add_cmd to install "maint show test-options-completion-result". gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (test-misc, test-flag, test-boolean) (test-uinteger, test-enum): Adjust res_test_gdb_... calls to pass the expected output in the success.
2019-07-03 23:57:48 +08:00
&maintenance_show_cmdlist);
Introduce generic command options framework This commit adds a generic command options framework, that makes it easy enough to add '-'-style options to commands in a uniform way, instead of each command implementing option parsing in its own way. Options are defined in arrays of option_def objects (for option definition), and the same options definitions are used for supporting TAB completion, and also for generating the relevant help fragment of the "help" command. See the gdb::options::build_help function, which returns a string with the result of replacing %OPTIONS% in a template string with an auto-generated "help" string fragment for all the passed-in options. Since most options in GDB are in the form of "-OPT", with a single dash, this is the format that the framework supports. I like to think of gdb's "-OPT" as the equivalent to getopt's long options format ("--OPT"), and gdb's "/" as the equivalent to getopt's short options format. getopt's short options format allows mixing several one-character options, like "ls -als", kind of similar to gdb's "x /FMT" and "disassemble /MOD", etc. While with gdb's "-" options, the option is expected to have a full name, and to be abbreviatable. E.g., "watch -location", "break -function main", etc. This patch only deals with "-" options. The above comment serves more to disclose why I don't think we should support mixing several unrelated options in a single "-" option invocation, like "thread apply -qcs" instead of "thread apply -q -c -s". The following patches will add uses of the infrastructure to several key commands. Most notably, "print", "compile print", "backtrace", "frame apply" and "thread apply". I tried to add options to several commands in order to make sure the framework didn't leave that many open holes open. Options use the same type as set commands -- enum var_types. So boolean options are var_boolean, enum options are var_enum, etc. The idea is to share code between settings commands and command options. The "print" options will be based on the "set print" commands, and their names will be the same. Actually, their definitions will be the same too. There is a function to create "set/show" commands from an array for option definitions: /* Install set/show commands for options defined in OPTIONS. DATA is a pointer to the structure that holds the data associated with the OPTIONS array. */ extern void add_setshow_cmds_for_options (command_class cmd_class, void *data, gdb::array_view<const option_def> options, struct cmd_list_element **set_list, struct cmd_list_element **show_list); That will be used by several following patches. Other features: - You can use the "--" delimiter to explicitly indicate end of options. Several existing commands use this token sequence for this effect already, so this just standardizes it. - You can shorten option names, as long as unambiguous. Currently, some commands allow this (e.g., break -function), while others do not (thread apply all -ascending). As GDB allows abbreviating command names and other things, it feels more GDB-ish to allow abbreviating option names too, to me. - For boolean options, 0/1 stands for off/on, just like with boolean "set" commands. - For boolean options, "true" is implied, just like with boolean "set commands. These are the option types supported, with a few examples: - boolean options (var_boolean). The option's argument is optional. (gdb) print -pretty on -- *obj (gdb) print -pretty off -- *obj (gdb) print -p -- *obj (gdb) print -p 0 -- *obj - flag options (like var_boolean, but no option argument (on/off)) (gdb) thread apply all -s COMMAND - enum options (var_enum) (gdb) bt -entry-values compact (gdb) bt -e c - uinteger options (var_uinteger) (gdb) print -elements 100 -- *obj (gdb) print -e 100 -- *obj (gdb) print -elements unlimited -- *obj (gdb) print -e u -- *obj - zuinteger-unlimited options (var_zuinteger_unlimited) (gdb) print -max-depth 100 -- obj (gdb) print -max-depth -1 -- obj (gdb) print -max-depth unlimited -- obj Other var_types could be supported, of course. These were just the types that I needed for the commands that I ported over, in the following patches. It was interesting (and unfortunate) to find that we need at least 3 different modes to cover the existing commands: - Commands that require ending options with "--" if you specify any option: "print" and "compile print". - Commands that do not want to require "--", and want to error out if you specify an unknown option (i.e., an unknown argument that starts with '-'): "compile code" / "compile file". - Commands that do not want to require "--", and want to process unknown options themselves: "bt", because of "bt -COUNT", "thread/frame apply", because "-" is a valid command. The different behavior is encoded in the process_options_mode enum, passed to process_options/complete_options. For testing, this patch adds one representative maintenance command for each of the process_options_mode values, that are used by the testsuite to exercise the options framework: (gdb) maint test-options require-delimiter (gdb) maint test-options unknown-is-error (gdb) maint test-options unknown-is-operand and adds another command to help with TAB-completion testing: (gdb) maint show test-options-completion-result See their description at the top of the maint-test-options.c file. Docs/NEWS are in a patch later in the series. gdb/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * Makefile.in (SUBDIR_CLI_SRCS): Add cli/cli-option.c. (COMMON_SFILES): Add maint-test-settings.c. * cli/cli-decode.c (boolean_enums): New global, factored out from ... (add_setshow_boolean_cmd): ... here. * cli/cli-decode.h (boolean_enums): Declare. * cli/cli-option.c: New file. * cli/cli-option.h: New file. * cli/cli-setshow.c (parse_cli_boolean_value(const char **)): New, factored out from ... (parse_cli_boolean_value(const char *)): ... this. (is_unlimited_literal): Change parameter type to pointer to pointer. Adjust and advance ARG pointer. (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): New, factored out from ... (do_set_command): ... this. Adjust. * cli/cli-setshow.h (parse_cli_boolean_value) (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited) (parse_cli_var_enum): Declare. * cli/cli-utils.c: Include "cli/cli-option.h". (get_ulongest): New. * cli/cli-utils.h (get_ulongest): Declare. (check_for_argument): New overloads. * maint-test-options.c: New file. gdb/testsuite/ChangeLog: 2019-06-13 Pedro Alves <palves@redhat.com> * gdb.base/options.c: New file. * gdb.base/options.exp: New file.
2019-06-13 07:06:53 +08:00
}