Index: gdb/cli/cli-cmds.c |
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c |
index c905ca28dc4fb9d2120134d85847b42fd8a2fb67..52a6bc90a78c62f99c5e10511dd7ca490a29a7b0 100644 |
--- a/gdb/cli/cli-cmds.c |
+++ b/gdb/cli/cli-cmds.c |
@@ -1,6 +1,6 @@ |
/* GDB CLI commands. |
- Copyright (C) 2000-2005, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2000-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -27,7 +27,7 @@ |
#include "target.h" /* For baud_rate, remote_debug and remote_timeout. */ |
#include "gdb_wait.h" /* For shell escape implementation. */ |
#include "gdb_regex.h" /* Used by apropos_command. */ |
-#include "gdb_string.h" |
+#include <string.h> |
#include "gdb_vfork.h" |
#include "linespec.h" |
#include "expression.h" |
@@ -39,6 +39,7 @@ |
#include "source.h" |
#include "disasm.h" |
#include "tracepoint.h" |
+#include "filestuff.h" |
#include "ui-out.h" |
@@ -47,6 +48,7 @@ |
#include "cli/cli-script.h" |
#include "cli/cli-setshow.h" |
#include "cli/cli-cmds.h" |
+#include "cli/cli-utils.h" |
#include "python/python.h" |
@@ -86,8 +88,6 @@ static void edit_command (char *, int); |
static void list_command (char *, int); |
-void apropos_command (char *, int); |
- |
/* Prototypes for local utility functions */ |
static void ambiguous_line_spec (struct symtabs_and_lines *); |
@@ -96,7 +96,7 @@ static void filter_sals (struct symtabs_and_lines *); |
/* Limit the call depth of user-defined commands */ |
-int max_user_call_depth; |
+unsigned int max_user_call_depth; |
/* Define all cmd_list_elements. */ |
@@ -116,10 +116,6 @@ struct cmd_list_element *enablelist; |
struct cmd_list_element *disablelist; |
-/* Chain containing all defined toggle subcommands. */ |
- |
-struct cmd_list_element *togglelist; |
- |
/* Chain containing all defined stop subcommands. */ |
struct cmd_list_element *stoplist; |
@@ -136,10 +132,6 @@ struct cmd_list_element *detachlist; |
struct cmd_list_element *killlist; |
-/* Chain containing all defined "enable breakpoint" subcommands. */ |
- |
-struct cmd_list_element *enablebreaklist; |
- |
/* Chain containing all defined set subcommands */ |
struct cmd_list_element *setlist; |
@@ -188,8 +180,6 @@ struct cmd_list_element *setchecklist; |
struct cmd_list_element *showchecklist; |
-struct cmd_list_element *skiplist; |
- |
/* Command tracing state. */ |
int source_verbose = 0; |
@@ -293,8 +283,6 @@ complete_command (char *arg, int from_tty) |
unique item once. */ |
for (ix = 0; VEC_iterate (char_ptr, completions, ix, item); ++ix) |
{ |
- int next_item; |
- |
if (prev == NULL || strcmp (item, prev) != 0) |
{ |
printf_unfiltered ("%s%s\n", arg_prefix, item); |
@@ -319,10 +307,14 @@ is_complete_command (struct cmd_list_element *c) |
static void |
show_version (char *args, int from_tty) |
{ |
- immediate_quit++; |
print_gdb_version (gdb_stdout); |
printf_filtered ("\n"); |
- immediate_quit--; |
+} |
+ |
+static void |
+show_configuration (char *args, int from_tty) |
+{ |
+ print_gdb_configuration (gdb_stdout); |
} |
/* Handle the quit command. */ |
@@ -333,7 +325,7 @@ quit_command (char *args, int from_tty) |
if (!quit_confirm ()) |
error (_("Not confirmed.")); |
- disconnect_tracing (from_tty); |
+ query_if_trace_running (from_tty); |
quit_force (args, from_tty); |
} |
@@ -361,16 +353,17 @@ cd_command (char *dir, int from_tty) |
/* Found something other than leading repetitions of "/..". */ |
int found_real_path; |
char *p; |
+ struct cleanup *cleanup; |
/* If the new directory is absolute, repeat is a no-op; if relative, |
repeat might be useful but is more likely to be a mistake. */ |
dont_repeat (); |
if (dir == 0) |
- error_no_arg (_("new working directory")); |
+ dir = "~"; |
dir = tilde_expand (dir); |
- make_cleanup (xfree, dir); |
+ cleanup = make_cleanup (xfree, dir); |
if (chdir (dir) < 0) |
perror_with_name (dir); |
@@ -454,6 +447,8 @@ cd_command (char *dir, int from_tty) |
if (from_tty) |
pwd_command ((char *) 0, 1); |
+ |
+ do_cleanups (cleanup); |
} |
/* Show the current value of the 'script-extension' option. */ |
@@ -475,10 +470,7 @@ show_script_ext_mode (struct ui_file *file, int from_tty, |
we tried to open. |
If SEARCH_PATH is non-zero, and the file isn't found in cwd, |
- search for it in the source search path. |
- |
- NOTE: This calls openp which uses xfullpath to compute the full path |
- instead of gdb_realpath. Symbolic links are not resolved. */ |
+ search for it in the source search path. */ |
int |
find_and_open_script (const char *script_file, int search_path, |
@@ -487,7 +479,7 @@ find_and_open_script (const char *script_file, int search_path, |
char *file; |
int fd; |
struct cleanup *old_cleanups; |
- int search_flags = OPF_TRY_CWD_FIRST; |
+ int search_flags = OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH; |
file = tilde_expand (script_file); |
old_cleanups = make_cleanup (xfree, file); |
@@ -579,11 +571,14 @@ source_script_with_search (const char *file, int from_tty, int search_path) |
/* The script wasn't found, or was otherwise inaccessible. |
If the source command was invoked interactively, throw an |
error. Otherwise (e.g. if it was invoked by a script), |
- silently ignore the error. */ |
+ just emit a warning, rather than cause an error. */ |
if (from_tty) |
perror_with_name (file); |
else |
- return; |
+ { |
+ perror_warning_with_name (file); |
+ return; |
+ } |
} |
old_cleanups = make_cleanup (xfree, full_path); |
@@ -601,7 +596,7 @@ source_script_with_search (const char *file, int from_tty, int search_path) |
for use in loading .gdbinit scripts. */ |
void |
-source_script (char *file, int from_tty) |
+source_script (const char *file, int from_tty) |
{ |
source_script_with_search (file, from_tty, 0); |
} |
@@ -639,8 +634,7 @@ source_command (char *args, int from_tty) |
{ |
/* Make sure leading white space does not break the |
comparisons. */ |
- while (isspace(args[0])) |
- args++; |
+ args = skip_spaces (args); |
if (args[0] != '-') |
break; |
@@ -663,9 +657,7 @@ source_command (char *args, int from_tty) |
break; |
} |
- while (isspace (args[0])) |
- args++; |
- file = args; |
+ file = skip_spaces (args); |
} |
source_script_with_search (file, from_tty, search_path); |
@@ -677,7 +669,7 @@ source_command (char *args, int from_tty) |
static void |
echo_command (char *text, int from_tty) |
{ |
- char *p = text; |
+ const char *p = text; |
int c; |
if (text) |
@@ -738,6 +730,8 @@ shell_escape (char *arg, int from_tty) |
{ |
const char *p, *user_shell; |
+ close_most_fds (); |
+ |
if ((user_shell = (char *) getenv ("SHELL")) == NULL) |
user_shell = "/bin/sh"; |
@@ -770,7 +764,8 @@ edit_command (char *arg, int from_tty) |
struct symbol *sym; |
char *arg1; |
char *editor; |
- char *p, *fn; |
+ char *p; |
+ const char *fn; |
/* Pull in the current default source line if necessary. */ |
if (arg == 0) |
@@ -822,9 +817,8 @@ edit_command (char *arg, int from_tty) |
struct gdbarch *gdbarch; |
if (sal.symtab == 0) |
- /* FIXME-32x64--assumes sal.pc fits in long. */ |
error (_("No source file for address %s."), |
- hex_string ((unsigned long) sal.pc)); |
+ paddress (get_current_arch (), sal.pc)); |
gdbarch = get_objfile_arch (sal.symtab->objfile); |
sym = find_pc_function (sal.pc); |
@@ -832,11 +826,13 @@ edit_command (char *arg, int from_tty) |
printf_filtered ("%s is in %s (%s:%d).\n", |
paddress (gdbarch, sal.pc), |
SYMBOL_PRINT_NAME (sym), |
- sal.symtab->filename, sal.line); |
+ symtab_to_filename_for_display (sal.symtab), |
+ sal.line); |
else |
printf_filtered ("%s is at %s:%d.\n", |
paddress (gdbarch, sal.pc), |
- sal.symtab->filename, sal.line); |
+ symtab_to_filename_for_display (sal.symtab), |
+ sal.line); |
} |
/* If what was given does not imply a symtab, it must be an |
@@ -849,16 +845,7 @@ edit_command (char *arg, int from_tty) |
if ((editor = (char *) getenv ("EDITOR")) == NULL) |
editor = "/bin/ex"; |
- /* If we don't already know the full absolute file name of the |
- source file, find it now. */ |
- if (!sal.symtab->fullname) |
- { |
- fn = symtab_to_fullname (sal.symtab); |
- if (!fn) |
- fn = "unknown"; |
- } |
- else |
- fn = sal.symtab->fullname; |
+ fn = symtab_to_fullname (sal.symtab); |
/* Quote the file name, in case it has whitespace or other special |
characters. */ |
@@ -994,9 +981,8 @@ list_command (char *arg, int from_tty) |
struct gdbarch *gdbarch; |
if (sal.symtab == 0) |
- /* FIXME-32x64--assumes sal.pc fits in long. */ |
error (_("No source file for address %s."), |
- hex_string ((unsigned long) sal.pc)); |
+ paddress (get_current_arch (), sal.pc)); |
gdbarch = get_objfile_arch (sal.symtab->objfile); |
sym = find_pc_function (sal.pc); |
@@ -1004,11 +990,11 @@ list_command (char *arg, int from_tty) |
printf_filtered ("%s is in %s (%s:%d).\n", |
paddress (gdbarch, sal.pc), |
SYMBOL_PRINT_NAME (sym), |
- sal.symtab->filename, sal.line); |
+ symtab_to_filename_for_display (sal.symtab), sal.line); |
else |
printf_filtered ("%s is at %s:%d.\n", |
paddress (gdbarch, sal.pc), |
- sal.symtab->filename, sal.line); |
+ symtab_to_filename_for_display (sal.symtab), sal.line); |
} |
/* If line was not specified by just a line number, and it does not |
@@ -1099,7 +1085,7 @@ disassemble_current_function (int flags) |
frame = get_selected_frame (_("No frame selected.")); |
gdbarch = get_frame_arch (frame); |
- pc = get_frame_pc (frame); |
+ pc = get_frame_address_in_block (frame); |
if (find_pc_partial_function (pc, &name, &low, &high) == 0) |
error (_("No function contains program counter for selected frame.")); |
#if defined(TUI) |
@@ -1136,20 +1122,22 @@ disassemble_command (char *arg, int from_tty) |
const char *name; |
CORE_ADDR pc; |
int flags; |
+ const char *p; |
+ p = arg; |
name = NULL; |
flags = 0; |
- if (arg && *arg == '/') |
+ if (p && *p == '/') |
{ |
- ++arg; |
+ ++p; |
- if (*arg == '\0') |
+ if (*p == '\0') |
error (_("Missing modifier.")); |
- while (*arg && ! isspace (*arg)) |
+ while (*p && ! isspace (*p)) |
{ |
- switch (*arg++) |
+ switch (*p++) |
{ |
case 'm': |
flags |= DISASSEMBLY_SOURCE; |
@@ -1162,21 +1150,20 @@ disassemble_command (char *arg, int from_tty) |
} |
} |
- while (isspace (*arg)) |
- ++arg; |
+ p = skip_spaces_const (p); |
} |
- if (! arg || ! *arg) |
+ if (! p || ! *p) |
{ |
flags |= DISASSEMBLY_OMIT_FNAME; |
disassemble_current_function (flags); |
return; |
} |
- pc = value_as_address (parse_to_comma_and_eval (&arg)); |
- if (arg[0] == ',') |
- ++arg; |
- if (arg[0] == '\0') |
+ pc = value_as_address (parse_to_comma_and_eval (&p)); |
+ if (p[0] == ',') |
+ ++p; |
+ if (p[0] == '\0') |
{ |
/* One argument. */ |
if (find_pc_partial_function (pc, &name, &low, &high) == 0) |
@@ -1196,14 +1183,13 @@ disassemble_command (char *arg, int from_tty) |
/* Two arguments. */ |
int incl_flag = 0; |
low = pc; |
- while (isspace (*arg)) |
- arg++; |
- if (arg[0] == '+') |
+ p = skip_spaces_const (p); |
+ if (p[0] == '+') |
{ |
- ++arg; |
+ ++p; |
incl_flag = 1; |
} |
- high = parse_and_eval_address (arg); |
+ high = parse_and_eval_address (p); |
if (incl_flag) |
high += low; |
} |
@@ -1236,7 +1222,7 @@ show_user (char *args, int from_tty) |
if (args) |
{ |
- char *comname = args; |
+ const char *comname = args; |
c = lookup_cmd (&comname, cmdlist, "", 0, 1); |
/* c->user_commands would be NULL if it's a python command. */ |
@@ -1257,7 +1243,7 @@ show_user (char *args, int from_tty) |
/* Search through names of commands and documentations for a certain |
regular expression. */ |
-void |
+static void |
apropos_command (char *searchstr, int from_tty) |
{ |
regex_t pattern; |
@@ -1314,7 +1300,7 @@ argv_to_dyn_string (char **argv, int n) |
Return TRUE if COMMAND exists, unambiguously. Otherwise FALSE. */ |
static int |
-valid_command_p (char *command) |
+valid_command_p (const char *command) |
{ |
struct cmd_list_element *c; |
@@ -1341,14 +1327,14 @@ alias_command (char *args, int from_tty) |
char *args2, *equals, *alias, *command; |
char **alias_argv, **command_argv; |
dyn_string_t alias_dyn_string, command_dyn_string; |
- struct cmd_list_element *c; |
+ struct cleanup *cleanup; |
static const char usage[] = N_("Usage: alias [-a] [--] ALIAS = COMMAND"); |
if (args == NULL || strchr (args, '=') == NULL) |
error (_(usage)); |
args2 = xstrdup (args); |
- make_cleanup (xfree, args2); |
+ cleanup = make_cleanup (xfree, args2); |
equals = strchr (args2, '='); |
*equals = '\0'; |
alias_argv = gdb_buildargv (args2); |
@@ -1424,7 +1410,7 @@ alias_command (char *args, int from_tty) |
else |
{ |
dyn_string_t alias_prefix_dyn_string, command_prefix_dyn_string; |
- char *alias_prefix, *command_prefix; |
+ const char *alias_prefix, *command_prefix; |
struct cmd_list_element *c_alias, *c_command; |
if (alias_argc != command_argc) |
@@ -1455,6 +1441,8 @@ alias_command (char *args, int from_tty) |
command_argv[command_argc - 1], |
class_alias, abbrev_flag, c_command->prefixlist); |
} |
+ |
+ do_cleanups (cleanup); |
} |
/* Print a list of files and line numbers which a user may choose from |
@@ -1469,7 +1457,8 @@ ambiguous_line_spec (struct symtabs_and_lines *sals) |
for (i = 0; i < sals->nelts; ++i) |
printf_filtered (_("file: \"%s\", line number: %d\n"), |
- sals->sals[i].symtab->filename, sals->sals[i].line); |
+ symtab_to_filename_for_display (sals->sals[i].symtab), |
+ sals->sals[i].line); |
} |
/* Sort function for filter_sals. */ |
@@ -1542,13 +1531,14 @@ filter_sals (struct symtabs_and_lines *sals) |
++out; |
} |
} |
- sals->nelts = out; |
if (sals->nelts == 0) |
{ |
xfree (sals->sals); |
sals->sals = NULL; |
} |
+ else |
+ sals->nelts = out; |
} |
static void |
@@ -1569,30 +1559,6 @@ void |
init_cmd_lists (void) |
{ |
max_user_call_depth = 1024; |
- |
- cmdlist = NULL; |
- infolist = NULL; |
- enablelist = NULL; |
- disablelist = NULL; |
- togglelist = NULL; |
- stoplist = NULL; |
- deletelist = NULL; |
- detachlist = NULL; |
- enablebreaklist = NULL; |
- setlist = NULL; |
- unsetlist = NULL; |
- showlist = NULL; |
- sethistlist = NULL; |
- showhistlist = NULL; |
- unsethistlist = NULL; |
- maintenancelist = NULL; |
- maintenanceinfolist = NULL; |
- maintenanceprintlist = NULL; |
- setprintlist = NULL; |
- showprintlist = NULL; |
- setchecklist = NULL; |
- showchecklist = NULL; |
- skiplist = NULL; |
} |
static void |
@@ -1617,14 +1583,6 @@ show_history_expansion_p (struct ui_file *file, int from_tty, |
} |
static void |
-show_baud_rate (struct ui_file *file, int from_tty, |
- struct cmd_list_element *c, const char *value) |
-{ |
- fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"), |
- value); |
-} |
- |
-static void |
show_remote_debug (struct ui_file *file, int from_tty, |
struct cmd_list_element *c, const char *value) |
{ |
@@ -1651,11 +1609,13 @@ show_max_user_call_depth (struct ui_file *file, int from_tty, |
} |
+ |
+initialize_file_ftype _initialize_cli_cmds; |
+ |
void |
-init_cli_cmds (void) |
+_initialize_cli_cmds (void) |
{ |
struct cmd_list_element *c; |
- char *source_help_text; |
/* Define the classes of commands. |
They will appear in the help list in alphabetical order. */ |
@@ -1711,30 +1671,6 @@ use \"\\n\" if you want a newline to be printed.\n\ |
Since leading and trailing whitespace are ignored in command arguments,\n\ |
if you want to print some you must use \"\\\" before leading whitespace\n\ |
to be printed or after trailing whitespace.")); |
- add_com ("document", class_support, document_command, _("\ |
-Document a user-defined command.\n\ |
-Give command name as argument. Give documentation on following lines.\n\ |
-End with a line of just \"end\".")); |
- add_com ("define", class_support, define_command, _("\ |
-Define a new command name. Command name is argument.\n\ |
-Definition appears on following lines, one command per line.\n\ |
-End with a line of just \"end\".\n\ |
-Use the \"document\" command to give documentation for the new command.\n\ |
-Commands defined in this way may have up to ten arguments.")); |
- |
- source_help_text = xstrprintf (_("\ |
-Read commands from a file named FILE.\n\ |
-\n\ |
-Usage: source [-s] [-v] FILE\n\ |
--s: search for the script in the source search path,\n\ |
- even if FILE contains directories.\n\ |
--v: each command in FILE is echoed as it is executed.\n\ |
-\n\ |
-Note that the file \"%s\" is read automatically in this way\n\ |
-when GDB is started."), gdbinit); |
- c = add_cmd ("source", class_support, source_command, |
- source_help_text, &cmdlist); |
- set_cmd_completer (c, filename_completer); |
add_setshow_enum_cmd ("script-extension", class_support, |
script_ext_enums, &script_ext_mode, _("\ |
@@ -1802,29 +1738,8 @@ the previous command number shown."), |
add_cmd ("version", no_set_class, show_version, |
_("Show what version of GDB this is."), &showlist); |
- add_com ("while", class_support, while_command, _("\ |
-Execute nested commands WHILE the conditional expression is non zero.\n\ |
-The conditional expression must follow the word `while' and must in turn be\n\ |
-followed by a new line. The nested commands must be entered one per line,\n\ |
-and should be terminated by the word `end'.")); |
- |
- add_com ("if", class_support, if_command, _("\ |
-Execute nested commands once IF the conditional expression is non zero.\n\ |
-The conditional expression must follow the word `if' and must in turn be\n\ |
-followed by a new line. The nested commands must be entered one per line,\n\ |
-and should be terminated by the word 'else' or `end'. If an else clause\n\ |
-is used, the same rules apply to its nested commands as to the first ones.")); |
- |
- /* If target is open when baud changes, it doesn't take effect until |
- the next open (I think, not sure). */ |
- add_setshow_zinteger_cmd ("remotebaud", no_class, &baud_rate, _("\ |
-Set baud rate for remote serial I/O."), _("\ |
-Show baud rate for remote serial I/O."), _("\ |
-This value is used to set the speed of the serial port when debugging\n\ |
-using remote targets."), |
- NULL, |
- show_baud_rate, |
- &setlist, &showlist); |
+ add_cmd ("configuration", no_set_class, show_configuration, |
+ _("Show how GDB was configured at build time."), &showlist); |
add_setshow_zinteger_cmd ("remote", no_class, &remote_debug, _("\ |
Set debugging of remote protocol."), _("\ |
@@ -1835,14 +1750,15 @@ is displayed."), |
show_remote_debug, |
&setdebuglist, &showdebuglist); |
- add_setshow_integer_cmd ("remotetimeout", no_class, &remote_timeout, _("\ |
+ add_setshow_zuinteger_unlimited_cmd ("remotetimeout", no_class, |
+ &remote_timeout, _("\ |
Set timeout limit to wait for target to respond."), _("\ |
Show timeout limit to wait for target to respond."), _("\ |
This value is used to set the time limit for gdb to wait for a response\n\ |
from the target."), |
- NULL, |
- show_remote_timeout, |
- &setlist, &showlist); |
+ NULL, |
+ show_remote_timeout, |
+ &setlist, &showlist); |
add_prefix_cmd ("debug", no_class, set_debug, |
_("Generic command for setting gdb debugging flags"), |
@@ -1899,7 +1815,12 @@ With a /m modifier, source lines are included (if available).\n\ |
With a /r modifier, raw instructions in hex are included.\n\ |
With a single argument, the function surrounding that address is dumped.\n\ |
Two arguments (separated by a comma) are taken as a range of memory to dump,\n\ |
- in the form of \"start,end\", or \"start,+length\".")); |
+ in the form of \"start,end\", or \"start,+length\".\n\ |
+\n\ |
+Note that the address is interpreted as an expression, not as a location\n\ |
+like in the \"break\" command.\n\ |
+So, for example, if you want to disassemble function bar in file foo.c\n\ |
+you must type \"disassemble 'foo.c'::bar\" and not \"disassemble foo.c:bar\".")); |
set_cmd_completer (c, location_completer); |
if (xdb_commands) |
add_com_alias ("va", "disassemble", class_xdb, 0); |
@@ -1916,13 +1837,13 @@ With no argument, show definitions of all user defined commands."), &showlist); |
add_com ("apropos", class_support, apropos_command, |
_("Search for commands matching a REGEXP")); |
- add_setshow_integer_cmd ("max-user-call-depth", no_class, |
+ add_setshow_uinteger_cmd ("max-user-call-depth", no_class, |
&max_user_call_depth, _("\ |
Set the max call depth for non-python user-defined commands."), _("\ |
Show the max call depth for non-python user-defined commands."), NULL, |
- NULL, |
- show_max_user_call_depth, |
- &setlist, &showlist); |
+ NULL, |
+ show_max_user_call_depth, |
+ &setlist, &showlist); |
add_setshow_boolean_cmd ("trace-commands", no_class, &trace_commands, _("\ |
Set tracing of GDB CLI commands."), _("\ |
@@ -1946,3 +1867,24 @@ Make \"spe\" an alias of \"set print elements\":\n\ |
Make \"elms\" an alias of \"elements\" in the \"set print\" command:\n\ |
alias -a set print elms = set print elements")); |
} |
+ |
+void |
+init_cli_cmds (void) |
+{ |
+ struct cmd_list_element *c; |
+ char *source_help_text; |
+ |
+ source_help_text = xstrprintf (_("\ |
+Read commands from a file named FILE.\n\ |
+\n\ |
+Usage: source [-s] [-v] FILE\n\ |
+-s: search for the script in the source search path,\n\ |
+ even if FILE contains directories.\n\ |
+-v: each command in FILE is echoed as it is executed.\n\ |
+\n\ |
+Note that the file \"%s\" is read automatically in this way\n\ |
+when GDB is started."), gdbinit); |
+ c = add_cmd ("source", class_support, source_command, |
+ source_help_text, &cmdlist); |
+ set_cmd_completer (c, filename_completer); |
+} |