| 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)."));
|
|
|