X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fprogspace.c;h=1c0a254bfb8c6877868c97cffe2845c4d8c43613;hb=5e7cf0784c9b543b1870b974a78244c40105c523;hp=2a031ed4f9e75bb9bf7e3b77c5d2760575c93e8a;hpb=23a44de8103159b27793ce556932619ed6cc6b01;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/progspace.c b/gdb/progspace.c index 2a031ed4f9..1c0a254bfb 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-2013 Free Software Foundation, Inc. + Copyright (C) 2009-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -44,17 +44,25 @@ static int highest_address_space_num; DEFINE_REGISTRY (program_space, REGISTRY_ACCESS_FIELD) - - -/* 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) + + + /* Create a new address space object, and add it to the list. */ struct address_space * @@ -62,8 +70,9 @@ new_address_space (void) { 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; } @@ -89,6 +98,7 @@ maybe_new_address_space (void) static void free_address_space (struct address_space *aspace) { + address_space_free_data (aspace); xfree (aspace); } @@ -116,7 +126,7 @@ add_program_space (struct address_space *aspace) { struct program_space *pspace; - pspace = XZALLOC (struct program_space); + pspace = XCNEW (struct program_space); pspace->num = ++last_program_space_num; pspace->aspace = aspace; @@ -150,8 +160,7 @@ release_program_space (struct program_space *pspace) 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); @@ -160,30 +169,6 @@ release_program_space (struct program_space *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. */ @@ -200,7 +185,7 @@ clone_program_space (struct program_space *dest, struct program_space *src) 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; @@ -296,10 +281,6 @@ print_program_space (struct ui_out *uiout, int requested) int count = 0; struct cleanup *old_chain; - /* Might as well prune away unneeded ones, so the user doesn't even - seem them. */ - prune_program_spaces (); - /* Compute number of pspaces we will print. */ ALL_PSPACES (pspace) { @@ -478,8 +459,7 @@ save_current_space_and_thread (void) return old_chain; } -/* Switches full context to program space PSPACE. Switches to the - first thread found bound to PSPACE. */ +/* See progspace.h */ void switch_to_program_space_and_thread (struct program_space *pspace) @@ -487,7 +467,7 @@ switch_to_program_space_and_thread (struct program_space *pspace) struct inferior *inf; inf = find_inferior_for_program_space (pspace); - if (inf != NULL) + if (inf != NULL && inf->pid != 0) { struct thread_info *tp;