| Index: gdb/progspace.c
|
| diff --git a/gdb/progspace.c b/gdb/progspace.c
|
| index 1065c277b9207c09b897a80f40fa6a5713e8b348..303e88e075480f22be2653c332240e19d4102d73 100644
|
| --- a/gdb/progspace.c
|
| +++ b/gdb/progspace.c
|
| @@ -1,6 +1,6 @@
|
| /* Program and address space management, for GDB, the GNU debugger.
|
|
|
| - Copyright (C) 2009-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -37,21 +37,32 @@ struct program_space *current_program_space;
|
| /* The last address space number assigned. */
|
| static int highest_address_space_num;
|
|
|
| -/* Prototypes for local functions */
|
| -
|
| -static void program_space_alloc_data (struct program_space *);
|
| -static void program_space_free_data (struct program_space *);
|
|
|
|
|
| -/* An address space. Currently this is not used for much other than
|
| - for comparing if pspaces/inferior/threads see the same address
|
| +/* Keep a registry of per-program_space data-pointers required by other GDB
|
| + modules. */
|
| +
|
| +DEFINE_REGISTRY (program_space, REGISTRY_ACCESS_FIELD)
|
| +
|
| +/* 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)
|
| +
|
| +
|
| +
|
| /* Create a new address space object, and add it to the list. */
|
|
|
| struct address_space *
|
| @@ -61,6 +72,7 @@ new_address_space (void)
|
|
|
| aspace = XZALLOC (struct address_space);
|
| aspace->num = ++highest_address_space_num;
|
| + address_space_alloc_data (aspace);
|
|
|
| return aspace;
|
| }
|
| @@ -72,7 +84,7 @@ new_address_space (void)
|
| 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)
|
| {
|
| @@ -86,6 +98,7 @@ maybe_new_address_space (void)
|
| static void
|
| free_address_space (struct address_space *aspace)
|
| {
|
| + address_space_free_data (aspace);
|
| xfree (aspace);
|
| }
|
|
|
| @@ -145,7 +158,7 @@ release_program_space (struct program_space *pspace)
|
| 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));
|
| @@ -193,11 +206,11 @@ clone_program_space (struct program_space *dest, struct program_space *src)
|
|
|
| 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;
|
| @@ -333,9 +346,8 @@ print_program_space (struct ui_out *uiout, int requested)
|
|
|
| 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");
|
|
|
| @@ -429,7 +441,7 @@ number_of_program_spaces (void)
|
| 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;
|
|
|
| @@ -451,7 +463,7 @@ update_address_spaces (void)
|
| }
|
|
|
| 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;
|
| @@ -469,7 +481,8 @@ save_current_space_and_thread (void)
|
| /* 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;
|
| @@ -517,108 +530,6 @@ clear_program_space_solib_cache (struct program_space *pspace)
|
|
|
|
|
|
|
| -/* 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 *));
|
| -}
|
| -
|
| -void
|
| -set_program_space_data (struct program_space *pspace,
|
| - const struct program_space_data *data,
|
| - void *value)
|
| -{
|
| - gdb_assert (data->index < pspace->num_data);
|
| - pspace->data[data->index] = value;
|
| -}
|
| -
|
| -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];
|
| -}
|
| -
|
| -
|
| -
|
| void
|
| initialize_progspace (void)
|
| {
|
|
|