* arch-utils.c (#include "gdbthread.h"): Removed.
[deliverable/binutils-gdb.git] / gdb / infcmd.c
index d20cb432b550a5570ab0540bc23cda5755c252f1..32a5954548af1dc3bc12d19b4f1e29d18ac6dc09 100644 (file)
@@ -1,5 +1,6 @@
 /* Memory-access and commands for "inferior" process, for GDB.
 /* Memory-access and commands for "inferior" process, for GDB.
-   Copyright 1986, 87, 88, 89, 91, 92, 95, 96, 1998, 1999
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001
    Free Software Foundation, Inc.
 
    This file is part of GDB.
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -29,6 +30,7 @@
 #include "environ.h"
 #include "value.h"
 #include "gdbcmd.h"
 #include "environ.h"
 #include "value.h"
 #include "gdbcmd.h"
+#include "symfile.h"
 #include "gdbcore.h"
 #include "target.h"
 #include "language.h"
 #include "gdbcore.h"
 #include "target.h"
 #include "language.h"
@@ -178,11 +180,7 @@ CORE_ADDR step_frame_address;
 
 CORE_ADDR step_sp;
 
 
 CORE_ADDR step_sp;
 
-/* 1 means step over all subroutine calls.
-   0 means don't step over calls (used by stepi).
-   -1 means step over calls to undebuggable functions.  */
-
-int step_over_calls;
+enum step_over_calls_kind step_over_calls;
 
 /* If stepping, nonzero means step count is > 1
    so don't print frame next time inferior stops
 
 /* If stepping, nonzero means step count is > 1
    so don't print frame next time inferior stops
@@ -195,6 +193,23 @@ int step_multi;
 
 struct environ *inferior_environ;
 \f
 
 struct environ *inferior_environ;
 \f
+/* Accessor routines. */
+
+char *
+get_inferior_args (void)
+{
+  return inferior_args;
+}
+
+char *
+set_inferior_args (char *newargs)
+{
+  char *saved_args = inferior_args;
+
+  inferior_args = newargs;
+
+  return saved_args;
+}
 
 /* This function detects whether or not a '&' character (indicating
    background execution) has been added as *the last* of the arguments ARGS
 
 /* This function detects whether or not a '&' character (indicating
    background execution) has been added as *the last* of the arguments ARGS
@@ -284,7 +299,6 @@ Start it from the beginning? "))
     }
   else
     {
     }
   else
     {
-      char *cmd;
       int async_exec = strip_bg_char (&args);
 
       /* If we get a request for running in the bg but the target
       int async_exec = strip_bg_char (&args);
 
       /* If we get a request for running in the bg but the target
@@ -303,9 +317,8 @@ Start it from the beginning? "))
       /* If there were other args, beside '&', process them. */
       if (args)
        {
       /* If there were other args, beside '&', process them. */
       if (args)
        {
-         cmd = concat ("set args ", args, NULL);
-         make_cleanup (free, cmd);
-         execute_command (cmd, from_tty);
+          char *old_args = set_inferior_args (xstrdup (args));
+          xfree (old_args);
        }
     }
 
        }
     }
 
@@ -339,8 +352,8 @@ Start it from the beginning? "))
 static void
 run_no_args_command (char *args, int from_tty)
 {
 static void
 run_no_args_command (char *args, int from_tty)
 {
-  execute_command ("set args", from_tty);
-  run_command ((char *) NULL, from_tty);
+  char *old_args = set_inferior_args (xstrdup (""));
+  xfree (old_args);
 }
 \f
 
 }
 \f
 
@@ -513,11 +526,11 @@ which has no line number information.\n", name);
                /* It is stepi.
                   Don't step over function calls, not even to functions lacking
                   line numbers.  */
                /* It is stepi.
                   Don't step over function calls, not even to functions lacking
                   line numbers.  */
-               step_over_calls = 0;
+               step_over_calls = STEP_OVER_NONE;
            }
 
          if (skip_subroutines)
            }
 
          if (skip_subroutines)
-           step_over_calls = 1;
+           step_over_calls = STEP_OVER_ALL;
 
          step_multi = (count > 1);
          proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1);
 
          step_multi = (count > 1);
          proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1);
@@ -607,7 +620,13 @@ step_once (int skip_subroutines, int single_inst, int count)
       if (!single_inst)
        {
          find_pc_line_pc_range (stop_pc, &step_range_start, &step_range_end);
       if (!single_inst)
        {
          find_pc_line_pc_range (stop_pc, &step_range_start, &step_range_end);
-         if (step_range_end == 0)
+
+         /* If we have no line info, switch to stepi mode.  */
+         if (step_range_end == 0 && step_stop_if_no_debug)
+           {
+             step_range_start = step_range_end = 1;
+           }
+         else if (step_range_end == 0)
            {
              char *name;
              if (find_pc_partial_function (stop_pc, &name, &step_range_start,
            {
              char *name;
              if (find_pc_partial_function (stop_pc, &name, &step_range_start,
@@ -628,11 +647,11 @@ which has no line number information.\n", name);
            /* It is stepi.
               Don't step over function calls, not even to functions lacking
               line numbers.  */
            /* It is stepi.
               Don't step over function calls, not even to functions lacking
               line numbers.  */
-           step_over_calls = 0;
+           step_over_calls = STEP_OVER_NONE;
        }
 
       if (skip_subroutines)
        }
 
       if (skip_subroutines)
-       step_over_calls = 1;
+       step_over_calls = STEP_OVER_ALL;
 
       step_multi = (count > 1);
       arg1 =
 
       step_multi = (count > 1);
       arg1 =
@@ -694,7 +713,7 @@ jump_command (char *arg, int from_tty)
     }
 
   sal = sals.sals[0];
     }
 
   sal = sals.sals[0];
-  free ((PTR) sals.sals);
+  xfree (sals.sals);
 
   if (sal.symtab == 0 && sal.pc == 0)
     error ("No source file has been specified.");
 
   if (sal.symtab == 0 && sal.pc == 0)
     error ("No source file has been specified.");
@@ -958,7 +977,7 @@ until_next_command (int from_tty)
       step_range_end = sal.end;
     }
 
       step_range_end = sal.end;
     }
 
-  step_over_calls = 1;
+  step_over_calls = STEP_OVER_ALL;
   step_frame_address = FRAME_FP (frame);
   step_sp = read_sp ();
 
   step_frame_address = FRAME_FP (frame);
   step_sp = read_sp ();
 
@@ -1015,7 +1034,7 @@ print_return_value (int structure_return, struct type *value_type)
       stb = ui_out_stream_new (uiout);
       ui_out_text (uiout, "Value returned is ");
       ui_out_field_fmt (uiout, "gdb-result-var", "$%d", record_latest_value (value));
       stb = ui_out_stream_new (uiout);
       ui_out_text (uiout, "Value returned is ");
       ui_out_field_fmt (uiout, "gdb-result-var", "$%d", record_latest_value (value));
-      ui_out_text (uiout, "= ");
+      ui_out_text (uiout, " = ");
       value_print (value, stb->stream, 0, Val_no_prettyprint);
       ui_out_field_stream (uiout, "return-value", stb);
       ui_out_text (uiout, "\n");
       value_print (value, stb->stream, 0, Val_no_prettyprint);
       ui_out_field_stream (uiout, "return-value", stb);
       ui_out_text (uiout, "\n");
@@ -1047,7 +1066,7 @@ print_return_value (int structure_return, struct type *value_type)
       stb = ui_out_stream_new (uiout);
       ui_out_text (uiout, "Value returned is ");
       ui_out_field_fmt (uiout, "gdb-result-var", "$%d", record_latest_value (value));
       stb = ui_out_stream_new (uiout);
       ui_out_text (uiout, "Value returned is ");
       ui_out_field_fmt (uiout, "gdb-result-var", "$%d", record_latest_value (value));
-      ui_out_text (uiout, "= ");
+      ui_out_text (uiout, " = ");
       value_print (value, stb->stream, 0, Val_no_prettyprint);
       ui_out_field_stream (uiout, "return-value", stb);
       ui_out_text (uiout, "\n");
       value_print (value, stb->stream, 0, Val_no_prettyprint);
       ui_out_field_stream (uiout, "return-value", stb);
       ui_out_text (uiout, "\n");
@@ -1088,7 +1107,8 @@ finish_command_continuation (struct continuation_arg *arg)
 
       value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (function));
       if (!value_type)
 
       value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (function));
       if (!value_type)
-       internal_error ("finish_command: function has no target type");
+       internal_error (__FILE__, __LINE__,
+                       "finish_command: function has no target type");
 
       if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
        {
 
       if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
        {
@@ -1215,7 +1235,8 @@ finish_command (char *arg, int from_tty)
 
          value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (function));
          if (!value_type)
 
          value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (function));
          if (!value_type)
-           internal_error ("finish_command: function has no target type");
+           internal_error (__FILE__, __LINE__,
+                           "finish_command: function has no target type");
 
          /* FIXME: Shouldn't we do the cleanups before returning? */
          if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
 
          /* FIXME: Shouldn't we do the cleanups before returning? */
          if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
@@ -1373,7 +1394,7 @@ set_environment_command (char *arg, int from_tty)
     }
   else
     set_in_environ (inferior_environ, var, val);
     }
   else
     set_in_environ (inferior_environ, var, val);
-  free (var);
+  xfree (var);
 }
 
 static void
 }
 
 static void
@@ -1418,10 +1439,10 @@ path_command (char *dirname, int from_tty)
   /* Can be null if path is not set */
   if (!env)
     env = "";
   /* Can be null if path is not set */
   if (!env)
     env = "";
-  exec_path = strsave (env);
+  exec_path = xstrdup (env);
   mod_path (dirname, &exec_path);
   set_in_environ (inferior_environ, path_var_name, exec_path);
   mod_path (dirname, &exec_path);
   set_in_environ (inferior_environ, path_var_name, exec_path);
-  free (exec_path);
+  xfree (exec_path);
   if (from_tty)
     path_info ((char *) NULL, from_tty);
 }
   if (from_tty)
     path_info ((char *) NULL, from_tty);
 }
@@ -1445,12 +1466,12 @@ void
 do_registers_info (int regnum, int fpregs)
 {
   register int i;
 do_registers_info (int regnum, int fpregs)
 {
   register int i;
-  int numregs = ARCH_NUM_REGS;
+  int numregs = NUM_REGS + NUM_PSEUDO_REGS;
 
   for (i = 0; i < numregs; i++)
     {
 
   for (i = 0; i < numregs; i++)
     {
-      char raw_buffer[MAX_REGISTER_RAW_SIZE];
-      char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
+      char *raw_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
+      char *virtual_buffer = (char*) alloca (MAX_REGISTER_VIRTUAL_SIZE);
 
       /* Decide between printing all regs, nonfloat regs, or specific reg.  */
       if (regnum == -1)
 
       /* Decide between printing all regs, nonfloat regs, or specific reg.  */
       if (regnum == -1)
@@ -1569,7 +1590,7 @@ registers_info (char *addr_exp, int fpregs)
       end = addr_exp;
       while (*end != '\0' && *end != ' ' && *end != '\t')
        ++end;
       end = addr_exp;
       while (*end != '\0' && *end != ' ' && *end != '\t')
        ++end;
-      numregs = ARCH_NUM_REGS;
+      numregs = NUM_REGS + NUM_PSEUDO_REGS;
 
       regnum = target_map_name_to_register (addr_exp, end - addr_exp);
       if (regnum >= 0)
 
       regnum = target_map_name_to_register (addr_exp, end - addr_exp);
       if (regnum >= 0)
@@ -1684,7 +1705,7 @@ attach_command (char *args, int from_tty)
            full_exec_path = savestring (exec_file, strlen (exec_file));
 
          exec_file_attach (full_exec_path, from_tty);
            full_exec_path = savestring (exec_file, strlen (exec_file));
 
          exec_file_attach (full_exec_path, from_tty);
-         symbol_file_command (full_exec_path, from_tty);
+         symbol_file_add_main (full_exec_path, from_tty);
        }
     }
 
        }
     }
 
@@ -1774,16 +1795,17 @@ _initialize_infcmd (void)
 {
   struct cmd_list_element *c;
 
 {
   struct cmd_list_element *c;
 
-  add_com ("tty", class_run, tty_command,
-          "Set terminal for future runs of program being debugged.");
+  c= add_com ("tty", class_run, tty_command,
+             "Set terminal for future runs of program being debugged.");
+  c->completer = filename_completer;
 
 
-  add_show_from_set
-    (add_set_cmd ("args", class_run, var_string_noescape,
-                 (char *) &inferior_args,
-                 "Set argument list to give program being debugged when it is started.\n\
+  c = add_set_cmd ("args", class_run, var_string_noescape,
+                  (char *) &inferior_args,
+                  "Set argument list to give program being debugged when it is started.\n\
 Follow this command with any number of args, to be passed to the program.",
 Follow this command with any number of args, to be passed to the program.",
-                 &setlist),
-     &showlist);
+                  &setlist);
+  add_show_from_set (c, &showlist);
+  c->completer = filename_completer;
 
   c = add_cmd
     ("environment", no_class, environment_info,
 
   c = add_cmd
     ("environment", no_class, environment_info,
@@ -1811,12 +1833,13 @@ This does not affect the program until the next \"run\" command.",
               &setlist);
   c->completer = noop_completer;
 
               &setlist);
   c->completer = noop_completer;
 
-  add_com ("path", class_files, path_command,
-          "Add directory DIR(s) to beginning of search path for object files.\n\
+  c = add_com ("path", class_files, path_command,
+              "Add directory DIR(s) to beginning of search path for object files.\n\
 $cwd in the path means the current working directory.\n\
 This path is equivalent to the $PATH shell variable.  It is a list of\n\
 directories, separated by colons.  These directories are searched to find\n\
 fully linked executable files and separately compiled object files as needed.");
 $cwd in the path means the current working directory.\n\
 This path is equivalent to the $PATH shell variable.  It is a list of\n\
 directories, separated by colons.  These directories are searched to find\n\
 fully linked executable files and separately compiled object files as needed.");
+  c->completer = filename_completer;
 
   c = add_cmd ("paths", no_class, path_info,
               "Current search path for finding object files.\n\
 
   c = add_cmd ("paths", no_class, path_info,
               "Current search path for finding object files.\n\
@@ -1908,13 +1931,14 @@ the breakpoint won't break until the Nth time it is reached).");
   add_com_alias ("c", "cont", class_run, 1);
   add_com_alias ("fg", "cont", class_run, 1);
 
   add_com_alias ("c", "cont", class_run, 1);
   add_com_alias ("fg", "cont", class_run, 1);
 
-  add_com ("run", class_run, run_command,
+  c = add_com ("run", class_run, run_command,
           "Start debugged program.  You may specify arguments to give it.\n\
 Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\
 Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\n\
 With no arguments, uses arguments last specified (with \"run\" or \"set args\").\n\
 To cancel previous arguments and run with no arguments,\n\
 use \"set args\" without arguments.");
           "Start debugged program.  You may specify arguments to give it.\n\
 Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\
 Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\n\
 With no arguments, uses arguments last specified (with \"run\" or \"set args\").\n\
 To cancel previous arguments and run with no arguments,\n\
 use \"set args\" without arguments.");
+  c->completer = filename_completer;
   add_com_alias ("r", "run", class_run, 1);
   if (xdb_commands)
     add_com ("R", class_run, run_no_args_command,
   add_com_alias ("r", "run", class_run, 1);
   if (xdb_commands)
     add_com ("R", class_run, run_no_args_command,
@@ -1942,7 +1966,7 @@ Register name as argument means describe only that register.");
   add_info ("float", float_info,
            "Print the status of the floating point unit\n");
 
   add_info ("float", float_info,
            "Print the status of the floating point unit\n");
 
-  inferior_args = savestring ("", 1);  /* Initially no args */
+  set_inferior_args (xstrdup (""));    /* Initially no args */
   inferior_environ = make_environ ();
   init_environ (inferior_environ);
 }
   inferior_environ = make_environ ();
   init_environ (inferior_environ);
 }
This page took 0.027359 seconds and 4 git commands to generate.