/* Memory-access and commands for "inferior" process, for GDB.
- Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
This file is part of GDB.
#include <ctype.h>
#include "gdb_assert.h"
#include "observer.h"
+#include "target-descriptions.h"
/* Functions exported for general use, in inferior.h: */
void
post_create_inferior (struct target_ops *target, int from_tty)
{
+ /* Be sure we own the terminal in case write operations are performed. */
+ target_terminal_ours ();
+
+ /* If the target hasn't taken care of this already, do it now.
+ Targets which need to access registers during to_open,
+ to_create_inferior, or to_attach should do it earlier; but many
+ don't need to. */
+ target_find_description ();
+
if (exec_bfd)
{
/* Sometimes the platform-specific hook loads initial shared
kill_if_already_running (from_tty);
clear_breakpoint_hit_counts ();
+ /* Clean up any leftovers from other runs. Some other things from
+ this function should probably be moved into target_pre_inferior. */
+ target_pre_inferior (from_tty);
+
/* Purge old solib objfiles. */
objfile_purge_solibs ();
if (proc_count_exp != NULL)
{
bpstat bs = stop_bpstat;
- int num = bpstat_num (&bs);
- if (num == 0 && from_tty)
+ int num, stat;
+ int stopped = 0;
+
+ while ((stat = bpstat_num (&bs, &num)) != 0)
+ if (stat > 0)
+ {
+ set_ignore_count (num,
+ 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.". */
+ if (from_tty)
+ printf_filtered (" ");
+ stopped = 1;
+ }
+
+ if (!stopped && from_tty)
{
printf_filtered
("Not stopped at any breakpoint; argument ignored.\n");
}
- while (num != 0)
- {
- set_ignore_count (num,
- 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.". */
- if (from_tty)
- printf_filtered (" ");
- num = bpstat_num (&bs);
- }
}
if (from_tty)
error (_("The \"finish\" command does not take any arguments."));
if (!target_has_execution)
error (_("The program is not running."));
- if (deprecated_selected_frame == NULL)
- error (_("No selected frame."));
- frame = get_prev_frame (deprecated_selected_frame);
+ frame = get_prev_frame (get_selected_frame (_("No selected frame.")));
if (frame == 0)
error (_("\"finish\" not meaningful in the outermost frame."));
/* Find the function we will return from. */
- function = find_pc_function (get_frame_pc (deprecated_selected_frame));
+ function = find_pc_function (get_frame_pc (get_selected_frame (NULL)));
/* Print info on the selected frame, including level number but not
source. */
program_info (char *args, int from_tty)
{
bpstat bs = stop_bpstat;
- int num = bpstat_num (&bs);
+ int num;
+ int stat = bpstat_num (&bs, &num);
if (!target_has_execution)
{
hex_string ((unsigned long) stop_pc));
if (stop_step)
printf_filtered (_("It stopped after being stepped.\n"));
- else if (num != 0)
+ else if (stat != 0)
{
/* There may be several breakpoints in the same place, so this
isn't as strange as it seems. */
- while (num != 0)
+ while (stat != 0)
{
- if (num < 0)
+ if (stat < 0)
{
printf_filtered (_("\
It stopped at a breakpoint that has since been deleted.\n"));
}
else
printf_filtered (_("It stopped at breakpoint %d.\n"), num);
- num = bpstat_num (&bs);
+ stat = bpstat_num (&bs, &num);
}
}
else if (stop_signal != TARGET_SIGNAL_0)
int regnum, int print_all)
{
int i;
- const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
+ const int numregs = gdbarch_num_regs (current_gdbarch)
+ + gdbarch_num_pseudo_regs (current_gdbarch);
gdb_byte buffer[MAX_REGISTER_SIZE];
for (i = 0; i < numregs; i++)
/* If the register name is empty, it is undefined for this
processor, so don't display anything. */
- if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
+ if (gdbarch_register_name (current_gdbarch, i) == NULL
+ || *(gdbarch_register_name (current_gdbarch, i)) == '\0')
continue;
- fputs_filtered (REGISTER_NAME (i), file);
- print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
+ fputs_filtered (gdbarch_register_name (current_gdbarch, i), file);
+ print_spaces_filtered (15 - strlen (gdbarch_register_name
+ (current_gdbarch, i)), file);
/* Get the data in raw format. */
if (! frame_register_read (frame, i, buffer))
for (j = 0; j < register_size (current_gdbarch, i); j++)
{
int idx;
- if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+ if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
idx = j;
else
idx = register_size (current_gdbarch, i) - 1 - j;
void
registers_info (char *addr_exp, int fpregs)
{
+ struct frame_info *frame;
int regnum, numregs;
char *end;
if (!target_has_registers)
error (_("The program has no registers now."));
- if (deprecated_selected_frame == NULL)
- error (_("No selected frame."));
+ frame = get_selected_frame (NULL);
if (!addr_exp)
{
gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
- deprecated_selected_frame, -1, fpregs);
+ frame, -1, fpregs);
return;
}
/* A register name? */
{
- int regnum = frame_map_name_to_regnum (deprecated_selected_frame,
+ int regnum = frame_map_name_to_regnum (frame,
start, end - start);
if (regnum >= 0)
{
gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
- deprecated_selected_frame, regnum, fpregs);
+ frame, regnum, fpregs);
continue;
}
}
int regnum = strtol (start, &endptr, 0);
if (endptr == end
&& regnum >= 0
- && regnum < NUM_REGS + NUM_PSEUDO_REGS)
+ && regnum < gdbarch_num_regs (current_gdbarch)
+ + gdbarch_num_pseudo_regs (current_gdbarch))
{
gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
- deprecated_selected_frame, regnum, fpregs);
+ frame, regnum, fpregs);
continue;
}
}
if (group != NULL)
{
int regnum;
- for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
+ for (regnum = 0;
+ regnum < gdbarch_num_regs (current_gdbarch)
+ + gdbarch_num_pseudo_regs (current_gdbarch);
+ regnum++)
{
if (gdbarch_register_reggroup_p (current_gdbarch, regnum,
group))
gdbarch_print_registers_info (current_gdbarch,
- gdb_stdout, deprecated_selected_frame,
+ gdb_stdout, frame,
regnum, fpregs);
}
continue;
print_vector_info (struct gdbarch *gdbarch, struct ui_file *file,
struct frame_info *frame, const char *args)
{
- if (!target_has_registers)
- error (_("The program has no registers now."));
- if (deprecated_selected_frame == NULL)
- error (_("No selected frame."));
-
if (gdbarch_print_vector_info_p (gdbarch))
gdbarch_print_vector_info (gdbarch, file, frame, args);
else
int regnum;
int printed_something = 0;
- for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
+ for (regnum = 0;
+ regnum < gdbarch_num_regs (current_gdbarch)
+ + gdbarch_num_pseudo_regs (current_gdbarch);
+ regnum++)
{
if (gdbarch_register_reggroup_p (gdbarch, regnum, vector_reggroup))
{
static void
vector_info (char *args, int from_tty)
{
- print_vector_info (current_gdbarch, gdb_stdout, deprecated_selected_frame, args);
+ if (!target_has_registers)
+ error (_("The program has no registers now."));
+
+ print_vector_info (current_gdbarch, gdb_stdout,
+ get_selected_frame (NULL), args);
}
\f
error (_("Not killed."));
}
+ /* Clean up any leftovers from other runs. Some other things from
+ this function should probably be moved into target_pre_inferior. */
+ target_pre_inferior (from_tty);
+
/* Clear out solib state. Otherwise the solib state of the previous
inferior might have survived and is entirely wrong for the new
- target. This has been observed on Linux using glibc 2.3. How to
- reproduce:
+ target. This has been observed on GNU/Linux using glibc 2.3. How
+ to reproduce:
bash$ ./foo&
[1] 4711
print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
struct frame_info *frame, const char *args)
{
- if (!target_has_registers)
- error (_("The program has no registers now."));
- if (deprecated_selected_frame == NULL)
- error (_("No selected frame."));
-
if (gdbarch_print_float_info_p (gdbarch))
gdbarch_print_float_info (gdbarch, file, frame, args);
else
int regnum;
int printed_something = 0;
- for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
+ for (regnum = 0;
+ regnum < gdbarch_num_regs (current_gdbarch)
+ + gdbarch_num_pseudo_regs (current_gdbarch);
+ regnum++)
{
if (gdbarch_register_reggroup_p (gdbarch, regnum, float_reggroup))
{
static void
float_info (char *args, int from_tty)
{
+ if (!target_has_registers)
+ error (_("The program has no registers now."));
+
print_float_info (current_gdbarch, gdb_stdout,
- deprecated_selected_frame, args);
+ get_selected_frame (NULL), args);
}
\f
static void
(see the \"directory\" command). You can also use the \"file\" command\n\
to specify the program, and to load its symbol table."));
- add_com ("detach", class_run, detach_command, _("\
+ add_prefix_cmd ("detach", class_run, detach_command, _("\
Detach a process or file previously attached.\n\
If a process, it is no longer traced, and it continues its execution. If\n\
-you were debugging a file, the file is closed and gdb no longer accesses it."));
+you were debugging a file, the file is closed and gdb no longer accesses it."),
+ &detachlist, "detach ", 0, &cmdlist);
add_com ("disconnect", class_run, disconnect_command, _("\
Disconnect from a target.\n\