/* Program and address space management, for GDB, the GNU debugger.
- Copyright (C) 2009-2012 Free Software Foundation, Inc.
+ Copyright (C) 2009-2014 Free Software Foundation, Inc.
This file is part of GDB.
DEFINE_REGISTRY (program_space, REGISTRY_ACCESS_FIELD)
-\f
-
-/* An address space. Currently this is not used for much other than
- for comparing if pspaces/inferior/threads see the same address
+/* An address space. It is used for comparing if pspaces/inferior/threads
+ see the same address space and for associating caches to each address
space. */
struct address_space
{
int num;
+
+ /* Per aspace data-pointers required by other GDB modules. */
+ REGISTRY_FIELDS;
};
+/* Keep a registry of per-address_space data-pointers required by other GDB
+ modules. */
+
+DEFINE_REGISTRY (address_space, REGISTRY_ACCESS_FIELD)
+
+\f
+
/* Create a new address space object, and add it to the list. */
struct address_space *
{
struct address_space *aspace;
- aspace = XZALLOC (struct address_space);
+ aspace = XCNEW (struct address_space);
aspace->num = ++highest_address_space_num;
+ address_space_alloc_data (aspace);
return aspace;
}
static void
free_address_space (struct address_space *aspace)
{
+ address_space_free_data (aspace);
xfree (aspace);
}
{
struct program_space *pspace;
- pspace = XZALLOC (struct program_space);
+ pspace = XCNEW (struct program_space);
pspace->num = ++last_program_space_num;
pspace->aspace = aspace;
free_all_objfiles ();
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_section_table (&pspace->target_sections);
clear_program_space_solib_cache (pspace);
/* Discard any data modules have associated with the PSPACE. */
program_space_free_data (pspace);
do_cleanups (old_chain);
}
-/* Unlinks PSPACE from the pspace list, and releases it. */
-
-void
-remove_program_space (struct program_space *pspace)
-{
- struct program_space *ss, **ss_link;
-
- ss = program_spaces;
- ss_link = &program_spaces;
- while (ss)
- {
- if (ss != pspace)
- {
- ss_link = &ss->next;
- ss = *ss_link;
- continue;
- }
-
- *ss_link = ss->next;
- release_program_space (ss);
- ss = *ss_link;
- }
-}
-
/* Copies program space SRC to DEST. Copies the main executable file,
and the main symbol file. Returns DEST. */
set_current_program_space (dest);
- if (src->ebfd != NULL)
- exec_file_attach (bfd_get_filename (src->ebfd), 0);
+ if (src->pspace_exec_filename != NULL)
+ exec_file_attach (src->pspace_exec_filename, 0);
if (src->symfile_object_file != NULL)
- symbol_file_add_main (src->symfile_object_file->name, 0);
+ symbol_file_add_main (objfile_name (src->symfile_object_file), 0);
do_cleanups (old_chain);
return dest;
ui_out_field_int (uiout, "id", pspace->num);
- if (pspace->ebfd)
- ui_out_field_string (uiout, "exec",
- bfd_get_filename (pspace->ebfd));
+ if (pspace->pspace_exec_filename)
+ ui_out_field_string (uiout, "exec", pspace->pspace_exec_filename);
else
ui_out_field_skip (uiout, "exec");
/* If restoring to null thread, we need to restore the pspace as
well, hence, we need to save the current program space first. */
old_chain = save_current_program_space ();
- save_current_inferior ();
+ /* There's no need to save the current inferior here.
+ That is handled by make_cleanup_restore_current_thread. */
make_cleanup_restore_current_thread ();
return old_chain;