Add Guile as an extension language.
[deliverable/binutils-gdb.git] / gdb / cli / cli-cmds.c
index 8f78641fbddce4c8cccd203691d77e09112889e9..bfcd975dfc8272dc98512b62e463380797d19901 100644 (file)
@@ -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 <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,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);
 }
 \f
 /* Show the current value of the 'script-extension' option.  */
@@ -472,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);
@@ -515,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)
+      if (extlang != NULL)
        {
-         source_python_script (stream, file);
-       }
-      if (e.reason < 0)
-       {
-         /* 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.
@@ -564,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);
@@ -586,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);
 }
@@ -624,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;
@@ -648,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);
@@ -662,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)
@@ -723,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";
 
@@ -808,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);
@@ -818,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
@@ -971,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);
@@ -981,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
@@ -1113,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;
@@ -1139,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)
@@ -1173,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;
     }
@@ -1213,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);
@@ -1291,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;
 
@@ -1318,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);
@@ -1400,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)
@@ -1431,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);
 }
 \f
 /* Print a list of files and line numbers which a user may choose from
@@ -1445,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.  */
@@ -1546,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
@@ -1591,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)
@@ -1755,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."), _("\
@@ -1840,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);
@@ -1851,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,
@@ -1859,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);
This page took 0.044385 seconds and 4 git commands to generate.