diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-12-10 13:19:40 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-12-11 22:10:50 +0000 |
commit | 9ef6d4a1b48ea1f5693aa270b8b768146a31b9e9 (patch) | |
tree | f65e45536ae533f0d0ed7f54b2386949905c59b3 /gdb/cli | |
parent | 1536146f30900b77c8381930669532f4073df196 (diff) | |
download | gdb-9ef6d4a1b48ea1f5693aa270b8b768146a31b9e9.zip gdb-9ef6d4a1b48ea1f5693aa270b8b768146a31b9e9.tar.gz gdb-9ef6d4a1b48ea1f5693aa270b8b768146a31b9e9.tar.bz2 |
gdb: give deprecated command warning for aliases with a prefix
I noticed that deprecated aliases that have a prefix don't give a
deprecated command warning. For example looking in mi/mi-main.c we
see this:
c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &setlist);
deprecate_cmd (c, "set mi-async");
c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &showlist);
deprecate_cmd (c, "show mi-async");
So both 'set target-async' and 'show target-async' are deprecated and
should be giving a warning, however, in use we see no warning given.
This is a consequence of how the code that should give this
warning (deprecated_cmd_warning) performs a second command lookup in
order to distinguish between aliases and real commands, and that the
code that calls this (lookup_cmd_1) strips off prefix commands as it
calls itself recursively.
As a result when we are considering an alias like 'set target-async'
we first enter lookup_cmd_1 with text = "set target-async", we spot
the 'set' command prefix and then recursively call lookup_cmd_1 with
text = "target-async".
We spot that 'target-async' is a known alias but that it is
deprecated, and so call deprecated_cmd_warning passing in the value of
text, which remember is now "target-async".
In deprecated_cmd_warning we again perform a command lookup starting
from the top-level cmdlist, but now we're trying to find just
"target-async", this fails (as this command requires the 'set' prefix,
and so no warning is given.
I resolved this issue by passing a command list to the function
deprecated_cmd_warning, this is the list in which the command can be
found.
A new test is added to cover this case.
However, there is an additional problem which will be addressed in a
subsequent patch.
Consider this GDB session:
(gdb) define set xxx_yyy
Type commands for definition of "set xxx_yyy".
End with a line saying just "end".
>echo in set xxx_yyy command\n
>end
(gdb) alias set qqq_aaa=set xxx_yyy
(gdb) maintenance deprecate set qqq_aaa
(gdb) set qqq_aaa
Warning: 'qqq_aaa', an alias for the command 'xxx_yyy' is deprecated.
No alternative known.
in set xxx_yyy command
(gdb)
Notice the warning mentions 'qqq_aaa' and 'xxx_yyy', I consider this
to be wrong. I think the proper warning should read:
(gdb) set qqq_aaa
Warning: 'set qqq_aaa', an alias for the command 'set xxx_yyy' is deprecated.
No alternative known.
With the 'set' prefixes added. A later patch will resolve this
issue.
gdb/ChangeLog:
PR cli/15104
* cli/cli-decode.c (lookup_cmd_1): Pass command list to
deprecated_cmd_warning.
(deprecated_cmd_warning): Take extra parameter, call
lookup_cmd_composition_1 and pass new parameter through.
(lookup_cmd_composition_1): New function, takes implementation of
lookup_cmd_composition but with extra parameter.
(lookup_cmd_composition): Now calls lookup_cmd_composition_1
passing in cmdlist.
* command.h (deprecated_cmd_warning): Add extra parameter to
declaration.
* top.c (execute_command): Pass cmdlist to deprecated_cmd_warning.
gdb/testsuite/ChangeLog:
PR cli/15104
* gdb.base/commands.exp: Add additional tests.
* gdb.base/completion.exp: Add additional tests.
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-decode.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index c62b849..dc83f55 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -50,6 +50,12 @@ static void help_cmd_list (struct cmd_list_element *list, static void help_all (struct ui_file *stream); +static int lookup_cmd_composition_1 (const char *text, + struct cmd_list_element **alias, + struct cmd_list_element **prefix_cmd, + struct cmd_list_element **cmd, + struct cmd_list_element *cur_list); + /* Look up a command whose 'prefixlist' is KEY. Return the command if found, otherwise return NULL. */ @@ -1678,7 +1684,7 @@ lookup_cmd_1 (const char **text, struct cmd_list_element *clist, flags. */ if (found->deprecated_warn_user && !lookup_for_completion_p) - deprecated_cmd_warning (line); + deprecated_cmd_warning (line, clist); /* Return the default_args of the alias, not the default_args of the command it is pointing to. */ @@ -1891,13 +1897,13 @@ lookup_cmd (const char **line, struct cmd_list_element *list, */ void -deprecated_cmd_warning (const char *text) +deprecated_cmd_warning (const char *text, struct cmd_list_element *list) { struct cmd_list_element *alias = NULL; struct cmd_list_element *prefix_cmd = NULL; struct cmd_list_element *cmd = NULL; - if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd)) + if (!lookup_cmd_composition_1 (text, &alias, &prefix_cmd, &cmd, list)) /* Return if text doesn't evaluate to a command. */ return; @@ -1949,8 +1955,7 @@ deprecated_cmd_warning (const char *text) cmd->deprecated_warn_user = 0; } - -/* Look up the contents of TEXT as a command in the command list 'cmdlist'. +/* Look up the contents of TEXT as a command in the command list CUR_LIST. Return 1 on success, 0 on failure. If TEXT refers to an alias, *ALIAS will point to that alias. @@ -1964,23 +1969,22 @@ deprecated_cmd_warning (const char *text) exist, they are NULL when we return. */ -int -lookup_cmd_composition (const char *text, - struct cmd_list_element **alias, - struct cmd_list_element **prefix_cmd, - struct cmd_list_element **cmd) + +static int +lookup_cmd_composition_1 (const char *text, + struct cmd_list_element **alias, + struct cmd_list_element **prefix_cmd, + struct cmd_list_element **cmd, + struct cmd_list_element *cur_list) { char *command; int len, nfound; - struct cmd_list_element *cur_list; struct cmd_list_element *prev_cmd; *alias = NULL; *prefix_cmd = NULL; *cmd = NULL; - cur_list = cmdlist; - text = skip_spaces (text); while (1) @@ -2038,6 +2042,30 @@ lookup_cmd_composition (const char *text, } } +/* Look up the contents of TEXT as a command in the command list 'cmdlist'. + Return 1 on success, 0 on failure. + + If TEXT refers to an alias, *ALIAS will point to that alias. + + If TEXT is a subcommand (i.e. one that is preceded by a prefix + command) set *PREFIX_CMD. + + Set *CMD to point to the command TEXT indicates. + + If any of *ALIAS, *PREFIX_CMD, or *CMD cannot be determined or do not + exist, they are NULL when we return. + +*/ + +int +lookup_cmd_composition (const char *text, + struct cmd_list_element **alias, + struct cmd_list_element **prefix_cmd, + struct cmd_list_element **cmd) +{ + return lookup_cmd_composition_1 (text, alias, prefix_cmd, cmd, cmdlist); +} + /* Helper function for SYMBOL_COMPLETION_FUNCTION. */ /* Return a vector of char pointers which point to the different |