X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcli%2Fcli-cmds.c;h=bfcd975dfc8272dc98512b62e463380797d19901;hb=ed3ef33944c39d9a3cea72b9a7cef3c20f0e3461;hp=50d9de7cc267a51c8ee12f07fad06ffa5491e03e;hpb=5799c0b96918061a27fd0be85177aeac9d8fe71e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 50d9de7cc2..bfcd975dfc 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1,6 +1,6 @@ /* GDB CLI commands. - Copyright (C) 2000-2013 Free Software Foundation, Inc. + Copyright (C) 2000-2014 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 #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,8 +48,9 @@ #include "cli/cli-script.h" #include "cli/cli-setshow.h" #include "cli/cli-cmds.h" +#include "cli/cli-utils.h" -#include "python/python.h" +#include "extension.h" #ifdef TUI #include "tui/tui.h" /* For tui_active et.al. */ @@ -114,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; @@ -313,6 +311,12 @@ show_version (char *args, int from_tty) printf_filtered ("\n"); } +static void +show_configuration (char *args, int from_tty) +{ + print_gdb_configuration (gdb_stdout); +} + /* Handle the quit command. */ void @@ -321,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); } @@ -349,6 +353,7 @@ 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. */ @@ -358,7 +363,7 @@ cd_command (char *dir, int from_tty) dir = "~"; dir = tilde_expand (dir); - make_cleanup (xfree, dir); + cleanup = make_cleanup (xfree, dir); if (chdir (dir) < 0) perror_with_name (dir); @@ -442,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. */ @@ -463,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, @@ -475,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); @@ -518,33 +522,33 @@ find_and_open_script (const char *script_file, int search_path, static void source_script_from_stream (FILE *stream, const char *file) { - if (script_ext_mode != script_ext_off - && strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py")) + if (script_ext_mode != script_ext_off) { - volatile struct gdb_exception e; + const struct extension_language_defn *extlang + = get_ext_lang_of_file (file); - TRY_CATCH (e, RETURN_MASK_ERROR) - { - source_python_script (stream, file); - } - if (e.reason < 0) + if (extlang != NULL) { - /* Should we fallback to ye olde GDB script mode? */ - if (script_ext_mode == script_ext_soft - && e.reason == RETURN_ERROR && e.error == UNSUPPORTED_ERROR) + if (ext_lang_present_p (extlang)) { - fseek (stream, 0, SEEK_SET); - script_from_file (stream, (char*) file); + script_sourcer_func *sourcer + = ext_lang_script_sourcer (extlang); + + gdb_assert (sourcer != NULL); + sourcer (extlang, stream, file); + return; } - else + else if (script_ext_mode == script_ext_soft) { - /* Nope, just punt. */ - throw_exception (e); + /* Assume the file is a gdb script. + This is handled below. */ } + else + throw_ext_lang_unsupported (extlang); } } - else - script_from_file (stream, file); + + script_from_file (stream, file); } /* Worker to perform the "source" command. @@ -567,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); @@ -589,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); } @@ -627,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; @@ -651,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); @@ -665,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) @@ -726,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"; @@ -811,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); @@ -821,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 @@ -974,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); @@ -984,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 @@ -1116,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; @@ -1142,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) @@ -1176,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; } @@ -1216,10 +1222,10 @@ 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. */ + /* c->user_commands would be NULL if it's a python/scheme command. */ if (c->class != class_user || !c->user_commands) error (_("Not a user command.")); show_user_1 (c, "", args, gdb_stdout); @@ -1294,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; @@ -1321,13 +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 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); @@ -1403,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) @@ -1434,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 @@ -1448,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. */ @@ -1549,28 +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; - 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; } static void @@ -1594,14 +1582,6 @@ show_history_expansion_p (struct ui_file *file, int from_tty, value); } -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) @@ -1758,16 +1738,8 @@ the previous command number shown."), add_cmd ("version", no_set_class, show_version, _("Show what version of GDB this is."), &showlist); - /* 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."), _("\ @@ -1843,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); @@ -1854,7 +1831,7 @@ Two arguments (separated by a comma) are taken as a range of memory to dump,\n\ Run the ``make'' program using the rest of the line as arguments.")); set_cmd_completer (c, filename_completer); add_cmd ("user", no_class, show_user, _("\ -Show definitions of non-python user defined commands.\n\ +Show definitions of non-python/scheme user defined commands.\n\ Argument is the name of the user defined command.\n\ With no argument, show definitions of all user defined commands."), &showlist); add_com ("apropos", class_support, apropos_command, @@ -1862,8 +1839,8 @@ With no argument, show definitions of all user defined commands."), &showlist); 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, +Set the max call depth for non-python/scheme user-defined commands."), _("\ +Show the max call depth for non-python/scheme user-defined commands."), NULL, NULL, show_max_user_call_depth, &setlist, &showlist);