/* Program and address space management, for GDB, the GNU debugger.
- Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
This file is part of GDB.
/* The last address space number assigned. */
static int highest_address_space_num;
-/* Prototypes for local functions */
+\f
+
+/* Keep a registry of per-program_space data-pointers required by other GDB
+ modules. */
+
+DEFINE_REGISTRY (program_space, REGISTRY_ACCESS_FIELD)
-static void program_space_alloc_data (struct program_space *);
-static void program_space_free_data (struct program_space *);
\f
/* An address space. Currently this is not used for much other than
struct address_space *
maybe_new_address_space (void)
{
- int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch);
+ int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ());
if (shared_aspace)
{
no_shared_libraries (NULL, 0);
exec_close ();
free_all_objfiles ();
- if (!gdbarch_has_shared_address_space (target_gdbarch))
+ if (!gdbarch_has_shared_address_space (target_gdbarch ()))
free_address_space (pspace->aspace);
resize_section_table (&pspace->target_sections,
-resize_section_table (&pspace->target_sections, 0));
+ clear_program_space_solib_cache (pspace);
/* Discard any data modules have associated with the PSPACE. */
program_space_free_data (pspace);
xfree (pspace);
error (_("program space ID %d not known."), requested);
}
- print_program_space (uiout, requested);
+ print_program_space (current_uiout, requested);
}
/* Simply returns the count of program spaces. */
void
update_address_spaces (void)
{
- int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch);
+ int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ());
struct program_space *pspace;
struct inferior *inf;
}
for (inf = inferior_list; inf; inf = inf->next)
- if (gdbarch_has_global_solist (target_gdbarch))
+ if (gdbarch_has_global_solist (target_gdbarch ()))
inf->aspace = maybe_new_address_space ();
else
inf->aspace = inf->pspace->aspace;
\f
-/* Keep a registry of per-program_space data-pointers required by other GDB
- modules. */
-
-struct program_space_data
-{
- unsigned index;
- void (*cleanup) (struct program_space *, void *);
-};
-
-struct program_space_data_registration
-{
- struct program_space_data *data;
- struct program_space_data_registration *next;
-};
-
-struct program_space_data_registry
-{
- struct program_space_data_registration *registrations;
- unsigned num_registrations;
-};
-
-static struct program_space_data_registry program_space_data_registry
- = { NULL, 0 };
-
-const struct program_space_data *
-register_program_space_data_with_cleanup
- (void (*cleanup) (struct program_space *, void *))
-{
- struct program_space_data_registration **curr;
-
- /* Append new registration. */
- for (curr = &program_space_data_registry.registrations;
- *curr != NULL; curr = &(*curr)->next);
-
- *curr = XMALLOC (struct program_space_data_registration);
- (*curr)->next = NULL;
- (*curr)->data = XMALLOC (struct program_space_data);
- (*curr)->data->index = program_space_data_registry.num_registrations++;
- (*curr)->data->cleanup = cleanup;
-
- return (*curr)->data;
-}
-
-const struct program_space_data *
-register_program_space_data (void)
-{
- return register_program_space_data_with_cleanup (NULL);
-}
-
-static void
-program_space_alloc_data (struct program_space *pspace)
-{
- gdb_assert (pspace->data == NULL);
- pspace->num_data = program_space_data_registry.num_registrations;
- pspace->data = XCALLOC (pspace->num_data, void *);
-}
-
-static void
-program_space_free_data (struct program_space *pspace)
-{
- gdb_assert (pspace->data != NULL);
- clear_program_space_data (pspace);
- xfree (pspace->data);
- pspace->data = NULL;
-}
-
-void
-clear_program_space_data (struct program_space *pspace)
-{
- struct program_space_data_registration *registration;
- int i;
-
- gdb_assert (pspace->data != NULL);
-
- for (registration = program_space_data_registry.registrations, i = 0;
- i < pspace->num_data;
- registration = registration->next, i++)
- if (pspace->data[i] != NULL && registration->data->cleanup)
- registration->data->cleanup (pspace, pspace->data[i]);
-
- memset (pspace->data, 0, pspace->num_data * sizeof (void *));
-}
+/* See progspace.h. */
void
-set_program_space_data (struct program_space *pspace,
- const struct program_space_data *data,
- void *value)
+clear_program_space_solib_cache (struct program_space *pspace)
{
- gdb_assert (data->index < pspace->num_data);
- pspace->data[data->index] = value;
-}
+ VEC_free (so_list_ptr, pspace->added_solibs);
-void *
-program_space_data (struct program_space *pspace, const struct program_space_data *data)
-{
- gdb_assert (data->index < pspace->num_data);
- return pspace->data[data->index];
+ free_char_ptr_vec (pspace->deleted_solibs);
+ pspace->deleted_solibs = NULL;
}
\f
initialize_progspace (void)
{
add_cmd ("program-spaces", class_maintenance,
- maintenance_info_program_spaces_command, _("\
-Info about currently known program spaces."),
+ maintenance_info_program_spaces_command,
+ _("Info about currently known program spaces."),
&maintenanceinfolist);
/* There's always one program space. Note that this function isn't