mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 23:34:02 +08:00
cf00cd6faf
Currently, a user can define an alias, but cannot have default arguments for this alias. This patch modifies the 'alias' command so that default args can be provided. (gdb) h alias Define a new command that is an alias of an existing command. Usage: alias [-a] [--] ALIAS = COMMAND [DEFAULT-ARGS...] ALIAS is the name of the alias command to create. COMMAND is the command being aliased to. Options: -a Specify that ALIAS is an abbreviation of COMMAND. Abbreviations are not used in command completion.. GDB will automatically prepend the provided DEFAULT-ARGS to the list of arguments explicitly provided when using ALIAS. Use "help aliases" to list all user defined aliases and their default args. Examples: Make "spe" an alias of "set print elements": alias spe set print elements Make "elms" an alias of "elements" in the "set print" command: alias -a set print elms set print elements Make "btf" an alias of "backtrace -full -past-entry -past-main" : alias btf = backtrace -full -past-entry -past-main Make "wLapPeu" an alias of 2 nested "with": alias wLapPeu = with language pascal -- with print elements unlimited -- (gdb) The way 'default-args' is implemented makes it trivial to set default args also for GDB commands (such as "backtrace") and for GDB pre-defined aliases (such as "bt"). It was however deemed better to not allow to define default arguments for pre-defined commands and aliases, to avoid users believing that e.g. default args for "backtrace" would apply to "bt". If needed, default-args could be allowed for GDB predefined commands and aliases by adding a command 'set default-args GDB_COMMAND_OR_PREDEFINED_ALIAS [DEFAULT-ARGS...]'. * 'alias' command now has a completer that helps to complete: - ALIAS (if the user defines an alias after a prefix), - the aliased COMMAND - the possible options for the aliased COMMAND. * Help and apropos commands show the definitions of the aliases that have default arguments, e.g. (gdb) help backtrace backtrace, btf, where, bt alias btf = backtrace -full -past-entry -past-main Print backtrace of all stack frames, or innermost COUNT frames. Usage: backtrace [OPTION]... [QUALIFIER]... [COUNT | -COUNT] Options: -entry-values no|only|preferred|if-needed|both|compact|default Set printing of function arguments at function entry. ... gdb/ChangeLog 2020-06-22 Philippe Waroquiers <philippe.waroquiers@skynet.be> * cli/cli-cmds.c (lookup_cmd_for_default_args) (alias_command_completer) (make_alias_options_def_group): New functions. (alias_opts, alias_option_defs): New struct and array. (alias_usage_error): Update usage. (alias_command): Handles optional DEFAULT-ARGS... arguments. Use option framework. (_initialize_cli_cmds): Update alias command help. Update aliases command help. (show_user): Add NULL for new default_args lookup_cmd argument. (valid_command_p): Rename to validate_aliased_command. Add NULL for new default_args lookup_cmd argument. Verify that the aliased_command has no default args. * cli/cli-decode.c (help_cmd): Show aliases definitions. (lookup_cmd_1, lookup_cmd): New argument default_args. (add_alias_cmd): Add NULL for new default_args lookup_cmd argument. (print_help_for_command): Show default args under the layout alias some_alias = some_aliased_cmd some_alias_default_arg. * cli/cli-decode.h (struct cmd_list_element): New member default_args. xfree default_args in destructor. * cli/cli-script.c (process_next_line, do_define_command): Add NULL for new default_args lookup_cmd argument. * command.h: Declare new default_args argument in lookup_cmd and lookup_cmd_1. * completer.c (complete_line_internal_1): Add NULL for new default_args lookup_cmd or lookup_cmd_1 argument. * guile/scm-cmd.c (gdbscm_parse_command_name): Likewise. * guile/scm-param.c (add_setshow_generic, pascm_parameter_defined_p): Likewise. * infcmd.c (_initialize_infcmd): Likewise. * python/py-auto-load.c (gdbpy_initialize_auto_load): Likewise. * python/py-cmd.c (gdbpy_parse_command_name): Likewise. * python/py-param.c (add_setshow_generic): Likewise. * remote.c (_initialize_remote): Likewise. * top.c (execute_command): Prepend default_args if command has some. (set_verbose): Add NULL for new default_args lookup_cmd or lookup_cmd_1 argument. * tracepoint.c (validate_actionline, encode_actions_1): Add NULL for new default_args lookup_cmd or lookup_cmd_1 argument.
292 lines
10 KiB
C++
292 lines
10 KiB
C++
/* Header file for GDB command decoding library.
|
|
|
|
Copyright (C) 2000-2020 Free Software Foundation, Inc.
|
|
|
|
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/>. */
|
|
|
|
#ifndef CLI_CLI_DECODE_H
|
|
#define CLI_CLI_DECODE_H
|
|
|
|
/* This file defines the private interfaces for any code implementing
|
|
command internals. */
|
|
|
|
/* Include the public interfaces. */
|
|
#include "command.h"
|
|
#include "gdb_regex.h"
|
|
#include "cli-script.h"
|
|
#include "completer.h"
|
|
|
|
#if 0
|
|
/* FIXME: cagney/2002-03-17: Once cmd_type() has been removed, ``enum
|
|
cmd_types'' can be moved from "command.h" to "cli-decode.h". */
|
|
/* Not a set/show command. Note that some commands which begin with
|
|
"set" or "show" might be in this category, if their syntax does
|
|
not fall into one of the following categories. */
|
|
typedef enum cmd_types
|
|
{
|
|
not_set_cmd,
|
|
set_cmd,
|
|
show_cmd
|
|
}
|
|
cmd_types;
|
|
#endif
|
|
|
|
/* This structure records one command'd definition. */
|
|
|
|
|
|
struct cmd_list_element
|
|
{
|
|
cmd_list_element (const char *name_, enum command_class theclass_,
|
|
const char *doc_)
|
|
: name (name_),
|
|
theclass (theclass_),
|
|
cmd_deprecated (0),
|
|
deprecated_warn_user (0),
|
|
malloced_replacement (0),
|
|
doc_allocated (0),
|
|
name_allocated (0),
|
|
hook_in (0),
|
|
allow_unknown (0),
|
|
abbrev_flag (0),
|
|
type (not_set_cmd),
|
|
var_type (var_boolean),
|
|
doc (doc_)
|
|
{
|
|
memset (&function, 0, sizeof (function));
|
|
}
|
|
|
|
~cmd_list_element ()
|
|
{
|
|
if (doc && doc_allocated)
|
|
xfree ((char *) doc);
|
|
if (name_allocated)
|
|
xfree ((char *) name);
|
|
}
|
|
|
|
DISABLE_COPY_AND_ASSIGN (cmd_list_element);
|
|
|
|
|
|
/* Points to next command in this list. */
|
|
struct cmd_list_element *next = nullptr;
|
|
|
|
/* Name of this command. */
|
|
const char *name;
|
|
|
|
/* Command class; class values are chosen by application program. */
|
|
enum command_class theclass;
|
|
|
|
/* When 1 indicated that this command is deprecated. It may be
|
|
removed from gdb's command set in the future. */
|
|
|
|
unsigned int cmd_deprecated : 1;
|
|
|
|
/* The user needs to be warned that this is a deprecated command.
|
|
The user should only be warned the first time a command is
|
|
used. */
|
|
|
|
unsigned int deprecated_warn_user : 1;
|
|
|
|
/* When functions are deprecated at compile time (this is the way
|
|
it should, in general, be done) the memory containing the
|
|
replacement string is statically allocated. In some cases it
|
|
makes sense to deprecate commands at runtime (the testsuite is
|
|
one example). In this case the memory for replacement is
|
|
malloc'ed. When a command is undeprecated or re-deprecated at
|
|
runtime we don't want to risk calling free on statically
|
|
allocated memory, so we check this flag. */
|
|
|
|
unsigned int malloced_replacement : 1;
|
|
|
|
/* Set if the doc field should be xfree'd. */
|
|
|
|
unsigned int doc_allocated : 1;
|
|
|
|
/* Set if the name field should be xfree'd. */
|
|
|
|
unsigned int name_allocated : 1;
|
|
|
|
/* Flag that specifies if this command is already running its hook. */
|
|
/* Prevents the possibility of hook recursion. */
|
|
unsigned int hook_in : 1;
|
|
|
|
/* For prefix commands only:
|
|
nonzero means do not get an error if subcommand is not
|
|
recognized; call the prefix's own function in that case. */
|
|
unsigned int allow_unknown : 1;
|
|
|
|
/* Nonzero says this is an abbreviation, and should not
|
|
be mentioned in lists of commands.
|
|
This allows "br<tab>" to complete to "break", which it
|
|
otherwise wouldn't. */
|
|
unsigned int abbrev_flag : 1;
|
|
|
|
/* Type of "set" or "show" command (or SET_NOT_SET if not "set"
|
|
or "show"). */
|
|
ENUM_BITFIELD (cmd_types) type : 2;
|
|
|
|
/* What kind of variable is *VAR? */
|
|
ENUM_BITFIELD (var_types) var_type : 4;
|
|
|
|
/* Function definition of this command. NULL for command class
|
|
names and for help topics that are not really commands. NOTE:
|
|
cagney/2002-02-02: This function signature is evolving. For
|
|
the moment suggest sticking with either set_cmd_cfunc() or
|
|
set_cmd_sfunc(). */
|
|
void (*func) (struct cmd_list_element *c, const char *args, int from_tty)
|
|
= nullptr;
|
|
/* The command's real callback. At present func() bounces through
|
|
to one of the below. */
|
|
union
|
|
{
|
|
/* If type is not_set_cmd, call it like this: */
|
|
cmd_const_cfunc_ftype *const_cfunc;
|
|
/* If type is set_cmd or show_cmd, first set the variables,
|
|
and then call this: */
|
|
cmd_const_sfunc_ftype *sfunc;
|
|
}
|
|
function;
|
|
|
|
/* Local state (context) for this command. This can be anything. */
|
|
void *context = nullptr;
|
|
|
|
/* Documentation of this command (or help topic).
|
|
First line is brief documentation; remaining lines form, with it,
|
|
the full documentation. First line should end with a period.
|
|
Entire string should also end with a period, not a newline. */
|
|
const char *doc;
|
|
|
|
/* For set/show commands. A method for printing the output to the
|
|
specified stream. */
|
|
show_value_ftype *show_value_func = nullptr;
|
|
|
|
/* If this command is deprecated, this is the replacement name. */
|
|
const char *replacement = nullptr;
|
|
|
|
/* If this command represents a show command, then this function
|
|
is called before the variable's value is examined. */
|
|
void (*pre_show_hook) (struct cmd_list_element *c) = nullptr;
|
|
|
|
/* Hook for another command to be executed before this command. */
|
|
struct cmd_list_element *hook_pre = nullptr;
|
|
|
|
/* Hook for another command to be executed after this command. */
|
|
struct cmd_list_element *hook_post = nullptr;
|
|
|
|
/* Default arguments to automatically prepend to the user
|
|
provided arguments when running this command or alias. */
|
|
std::string default_args;
|
|
|
|
/* Nonzero identifies a prefix command. For them, the address
|
|
of the variable containing the list of subcommands. */
|
|
struct cmd_list_element **prefixlist = nullptr;
|
|
|
|
/* For prefix commands only:
|
|
String containing prefix commands to get here: this one
|
|
plus any others needed to get to it. Should end in a space.
|
|
It is used before the word "command" in describing the
|
|
commands reached through this prefix. */
|
|
const char *prefixname = nullptr;
|
|
|
|
/* The prefix command of this command. */
|
|
struct cmd_list_element *prefix = nullptr;
|
|
|
|
/* Completion routine for this command. */
|
|
completer_ftype *completer = symbol_completer;
|
|
|
|
/* Handle the word break characters for this completer. Usually
|
|
this function need not be defined, but for some types of
|
|
completers (e.g., Python completers declared as methods inside
|
|
a class) the word break chars may need to be redefined
|
|
depending on the completer type (e.g., for filename
|
|
completers). */
|
|
completer_handle_brkchars_ftype *completer_handle_brkchars = nullptr;
|
|
|
|
/* Destruction routine for this command. If non-NULL, this is
|
|
called when this command instance is destroyed. This may be
|
|
used to finalize the CONTEXT field, if needed. */
|
|
void (*destroyer) (struct cmd_list_element *self, void *context) = nullptr;
|
|
|
|
/* Pointer to variable affected by "set" and "show". Doesn't
|
|
matter if type is not_set. */
|
|
void *var = nullptr;
|
|
|
|
/* Pointer to NULL terminated list of enumerated values (like
|
|
argv). */
|
|
const char *const *enums = nullptr;
|
|
|
|
/* Pointer to command strings of user-defined commands */
|
|
counted_command_line user_commands;
|
|
|
|
/* Pointer to command that is hooked by this one, (by hook_pre)
|
|
so the hook can be removed when this one is deleted. */
|
|
struct cmd_list_element *hookee_pre = nullptr;
|
|
|
|
/* Pointer to command that is hooked by this one, (by hook_post)
|
|
so the hook can be removed when this one is deleted. */
|
|
struct cmd_list_element *hookee_post = nullptr;
|
|
|
|
/* Pointer to command that is aliased by this one, so the
|
|
aliased command can be located in case it has been hooked. */
|
|
struct cmd_list_element *cmd_pointer = nullptr;
|
|
|
|
/* Start of a linked list of all aliases of this command. */
|
|
struct cmd_list_element *aliases = nullptr;
|
|
|
|
/* Link pointer for aliases on an alias list. */
|
|
struct cmd_list_element *alias_chain = nullptr;
|
|
|
|
/* If non-null, the pointer to a field in 'struct
|
|
cli_suppress_notification', which will be set to true in cmd_func
|
|
when this command is being executed. It will be set back to false
|
|
when the command has been executed. */
|
|
int *suppress_notification = nullptr;
|
|
};
|
|
|
|
/* Functions that implement commands about CLI commands. */
|
|
|
|
extern void help_cmd (const char *, struct ui_file *);
|
|
|
|
extern void apropos_cmd (struct ui_file *, struct cmd_list_element *,
|
|
bool verbose, compiled_regex &, const char *);
|
|
|
|
/* Used to mark commands that don't do anything. If we just leave the
|
|
function field NULL, the command is interpreted as a help topic, or
|
|
as a class of commands. */
|
|
|
|
extern void not_just_help_class_command (const char *arg, int from_tty);
|
|
|
|
/* Print only the first line of STR on STREAM.
|
|
FOR_VALUE_PREFIX true indicates that the first line is output
|
|
to be a prefix to show a value (see deprecated_show_value_hack):
|
|
the first character is printed in uppercase, and the trailing
|
|
dot character is not printed. */
|
|
|
|
extern void print_doc_line (struct ui_file *stream, const char *str,
|
|
bool for_value_prefix);
|
|
|
|
/* The enums of boolean commands. */
|
|
extern const char * const boolean_enums[];
|
|
|
|
/* The enums of auto-boolean commands. */
|
|
extern const char * const auto_boolean_enums[];
|
|
|
|
/* Verify whether a given cmd_list_element is a user-defined command.
|
|
Return 1 if it is user-defined. Return 0 otherwise. */
|
|
|
|
extern int cli_user_command_p (struct cmd_list_element *);
|
|
|
|
extern int find_command_name_length (const char *);
|
|
|
|
#endif /* CLI_CLI_DECODE_H */
|