Index: gdb/inferior.c |
diff --git a/gdb/inferior.c b/gdb/inferior.c |
index 805acb4e92f19bcc09197c1aeb0307a26795d18b..28a520052ccd98f86639b0e3cb40061b906c0f18 100644 |
--- a/gdb/inferior.c |
+++ b/gdb/inferior.c |
@@ -1,6 +1,6 @@ |
/* Multi-process control for GDB, the GNU debugger. |
- Copyright (C) 2008-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2008-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -33,11 +33,16 @@ |
#include "environ.h" |
#include "cli/cli-utils.h" |
#include "continuations.h" |
+#include "arch-utils.h" |
+#include "target-descriptions.h" |
+#include "readline/tilde.h" |
void _initialize_inferiors (void); |
-static void inferior_alloc_data (struct inferior *inf); |
-static void inferior_free_data (struct inferior *inf); |
+/* Keep a registry of per-inferior data-pointers required by other GDB |
+ modules. */ |
+ |
+DEFINE_REGISTRY (inferior, REGISTRY_ACCESS_FIELD) |
struct inferior *inferior_list = NULL; |
static int highest_inferior_num; |
@@ -96,6 +101,7 @@ free_inferior (struct inferior *inf) |
xfree (inf->args); |
xfree (inf->terminal); |
free_environ (inf->environment); |
+ target_desc_info_free (inf->tdesc_info); |
xfree (inf->private); |
xfree (inf); |
} |
@@ -264,9 +270,15 @@ exit_inferior_1 (struct inferior *inftoex, int silent) |
inf->vfork_parent->vfork_child = NULL; |
inf->vfork_parent = NULL; |
} |
+ if (inf->vfork_child != NULL) |
+ { |
+ inf->vfork_child->vfork_parent = NULL; |
+ inf->vfork_child = NULL; |
+ } |
inf->has_exit_code = 0; |
inf->exit_code = 0; |
+ inf->pending_detach = 0; |
} |
void |
@@ -576,9 +588,8 @@ print_inferior (struct ui_out *uiout, char *requested_inferiors) |
ui_out_field_string (uiout, "target-id", |
inferior_pid_to_str (inf->pid)); |
- if (inf->pspace->ebfd) |
- ui_out_field_string (uiout, "exec", |
- bfd_get_filename (inf->pspace->ebfd)); |
+ if (inf->pspace->pspace_exec_filename != NULL) |
+ ui_out_field_string (uiout, "exec", inf->pspace->pspace_exec_filename); |
else |
ui_out_field_skip (uiout, "exec"); |
@@ -692,8 +703,8 @@ inferior_command (char *args, int from_tty) |
printf_filtered (_("[Switching to inferior %d [%s] (%s)]\n"), |
inf->num, |
inferior_pid_to_str (inf->pid), |
- (inf->pspace->ebfd |
- ? bfd_get_filename (inf->pspace->ebfd) |
+ (inf->pspace->pspace_exec_filename != NULL |
+ ? inf->pspace->pspace_exec_filename |
: _("<noexec>"))); |
if (inf->pid != 0) |
@@ -728,7 +739,7 @@ inferior_command (char *args, int from_tty) |
else if (inf->pid != 0) |
{ |
ui_out_text (current_uiout, "\n"); |
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); |
+ print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); |
} |
} |
@@ -786,6 +797,7 @@ add_inferior_with_spaces (void) |
struct address_space *aspace; |
struct program_space *pspace; |
struct inferior *inf; |
+ struct gdbarch_info info; |
/* If all inferiors share an address space on this system, this |
doesn't really return a new address space; otherwise, it |
@@ -796,6 +808,14 @@ add_inferior_with_spaces (void) |
inf->pspace = pspace; |
inf->aspace = pspace->aspace; |
+ /* Setup the inferior's initial arch, based on information obtained |
+ from the global "set ..." options. */ |
+ gdbarch_info_init (&info); |
+ inf->gdbarch = gdbarch_find_by_info (info); |
+ /* The "set ..." options reject invalid settings, so we should |
+ always have a valid arch by now. */ |
+ gdb_assert (inf->gdbarch != NULL); |
+ |
return inf; |
} |
@@ -830,7 +850,8 @@ add_inferior_command (char *args, int from_tty) |
++argv; |
if (!*argv) |
error (_("No argument to -exec")); |
- exec = *argv; |
+ exec = tilde_expand (*argv); |
+ make_cleanup (xfree, exec); |
} |
} |
else |
@@ -934,6 +955,12 @@ clone_inferior_command (char *args, int from_tty) |
inf = add_inferior (0); |
inf->pspace = pspace; |
inf->aspace = pspace->aspace; |
+ inf->gdbarch = orginf->gdbarch; |
+ |
+ /* If the original inferior had a user specified target |
+ description, make the clone use it too. */ |
+ if (target_desc_info_from_user_p (inf->tdesc_info)) |
+ copy_inferior_target_desc_info (inf, orginf); |
printf_filtered (_("Added inferior %d.\n"), inf->num); |
@@ -955,105 +982,6 @@ show_print_inferior_events (struct ui_file *file, int from_tty, |
-/* Keep a registry of per-inferior data-pointers required by other GDB |
- modules. */ |
- |
-struct inferior_data |
-{ |
- unsigned index; |
- void (*cleanup) (struct inferior *, void *); |
-}; |
- |
-struct inferior_data_registration |
-{ |
- struct inferior_data *data; |
- struct inferior_data_registration *next; |
-}; |
- |
-struct inferior_data_registry |
-{ |
- struct inferior_data_registration *registrations; |
- unsigned num_registrations; |
-}; |
- |
-static struct inferior_data_registry inferior_data_registry |
- = { NULL, 0 }; |
- |
-const struct inferior_data * |
-register_inferior_data_with_cleanup |
- (void (*cleanup) (struct inferior *, void *)) |
-{ |
- struct inferior_data_registration **curr; |
- |
- /* Append new registration. */ |
- for (curr = &inferior_data_registry.registrations; |
- *curr != NULL; curr = &(*curr)->next); |
- |
- *curr = XMALLOC (struct inferior_data_registration); |
- (*curr)->next = NULL; |
- (*curr)->data = XMALLOC (struct inferior_data); |
- (*curr)->data->index = inferior_data_registry.num_registrations++; |
- (*curr)->data->cleanup = cleanup; |
- |
- return (*curr)->data; |
-} |
- |
-const struct inferior_data * |
-register_inferior_data (void) |
-{ |
- return register_inferior_data_with_cleanup (NULL); |
-} |
- |
-static void |
-inferior_alloc_data (struct inferior *inf) |
-{ |
- gdb_assert (inf->data == NULL); |
- inf->num_data = inferior_data_registry.num_registrations; |
- inf->data = XCALLOC (inf->num_data, void *); |
-} |
- |
-static void |
-inferior_free_data (struct inferior *inf) |
-{ |
- gdb_assert (inf->data != NULL); |
- clear_inferior_data (inf); |
- xfree (inf->data); |
- inf->data = NULL; |
-} |
- |
-void |
-clear_inferior_data (struct inferior *inf) |
-{ |
- struct inferior_data_registration *registration; |
- int i; |
- |
- gdb_assert (inf->data != NULL); |
- |
- for (registration = inferior_data_registry.registrations, i = 0; |
- i < inf->num_data; |
- registration = registration->next, i++) |
- if (inf->data[i] != NULL && registration->data->cleanup) |
- registration->data->cleanup (inf, inf->data[i]); |
- |
- memset (inf->data, 0, inf->num_data * sizeof (void *)); |
-} |
- |
-void |
-set_inferior_data (struct inferior *inf, |
- const struct inferior_data *data, |
- void *value) |
-{ |
- gdb_assert (data->index < inf->num_data); |
- inf->data[data->index] = value; |
-} |
- |
-void * |
-inferior_data (struct inferior *inf, const struct inferior_data *data) |
-{ |
- gdb_assert (data->index < inf->num_data); |
- return inf->data[data->index]; |
-} |
- |
void |
initialize_inferiors (void) |
{ |
@@ -1068,6 +996,8 @@ initialize_inferiors (void) |
current_inferior_ = add_inferior (0); |
current_inferior_->pspace = current_program_space; |
current_inferior_->aspace = current_program_space->aspace; |
+ /* The architecture will be initialized shortly, by |
+ initialize_current_architecture. */ |
add_info ("inferiors", info_inferiors_command, |
_("IDs of specified inferiors (all inferiors if no argument).")); |