/* Memory-access and commands for "inferior" process, for GDB.
- Copyright 1986, 87, 88, 89, 91, 92, 95, 96, 1998, 1999
+ Copyright 1986, 87, 88, 89, 91, 92, 95, 96, 1998, 1999, 2001
Free Software Foundation, Inc.
This file is part of GDB.
#include "environ.h"
#include "value.h"
#include "gdbcmd.h"
+#include "symfile.h"
#include "gdbcore.h"
#include "target.h"
#include "language.h"
static void interrupt_target_command (char *args, int from_tty);
-#if !defined (DO_REGISTERS_INFO)
-static void do_registers_info (int, int);
-#endif
-
static void unset_environment_command (char *, int);
static void set_environment_command (char *, int);
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
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
}
else
{
- char *cmd;
int async_exec = strip_bg_char (&args);
/* If we get a request for running in the bg but the target
/* 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);
}
}
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
while (num != 0)
{
set_ignore_count (num,
- parse_and_eval_address (proc_count_exp) - 1,
+ parse_and_eval_long (proc_count_exp) - 1,
from_tty);
/* set_ignore_count prints a message ending with a period.
So print two spaces before "Continuing.". */
async_disable_stdin ();
}
- count = count_string ? parse_and_eval_address (count_string) : 1;
+ count = count_string ? parse_and_eval_long (count_string) : 1;
if (!single_inst || skip_subroutines) /* leave si command alone */
{
/* 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)
- step_over_calls = 1;
+ step_over_calls = STEP_OVER_ALL;
step_multi = (count > 1);
proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1);
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,
/* 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)
- step_over_calls = 1;
+ step_over_calls = STEP_OVER_ALL;
step_multi = (count > 1);
arg1 =
}
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 (oursig == TARGET_SIGNAL_UNKNOWN)
{
/* No, try numeric. */
- int num = parse_and_eval_address (signum_exp);
+ int num = parse_and_eval_long (signum_exp);
if (num == 0)
oursig = TARGET_SIGNAL_0;
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 ();
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");
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");
only chance we have to complete this command is in
fetch_inferior_event, which is called by the event loop as soon as it
detects that the target has stopped. This function is called via the
- cmd_continaution pointer. */
+ cmd_continuation pointer. */
void
finish_command_continuation (struct continuation_arg *arg)
{
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)
{
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)
}
else
set_in_environ (inferior_environ, var, val);
- free (var);
+ xfree (var);
}
static void
/* 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);
- free (exec_path);
+ xfree (exec_path);
if (from_tty)
path_info ((char *) NULL, from_tty);
}
all the registers, define the macro DO_REGISTERS_INFO(regnum, fp)
to provide that format. */
-#if !defined (DO_REGISTERS_INFO)
-
-#define DO_REGISTERS_INFO(regnum, fp) do_registers_info(regnum, fp)
-
-static void
+void
do_registers_info (int regnum, int fpregs)
{
register int 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)
printf_filtered ("\n");
}
}
-#endif /* no DO_REGISTERS_INFO. */
void
registers_info (char *addr_exp, int fpregs)
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);
}
}
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);
}