From 046ac79fc7a2417eb1e0e00bc496ff51a505d037 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 22 Jul 2013 20:51:11 +0000 Subject: [PATCH] 2013-07-22 Doug Evans gdb/ * exec.h (remove_target_sections): Delete arg abfd. * exec.c (remove_target_sections): Delete arg abfd. (exec_close): Update call to remove_target_sections. * solib.c (update_solib_list): Ditto. (reload_shared_libraries_1): Ditto. (clear_solib): Ditto, and unconditionally call remove_target_sections. --- gdb/ChangeLog | 9 +++++++++ gdb/exec.c | 17 ++++++++++------- gdb/exec.h | 6 +++--- gdb/solib.c | 7 +++---- gdb/target.h | 11 ++++++----- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b0d3e5506b..54e0395456 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2013-07-22 Doug Evans + + * exec.h (remove_target_sections): Delete arg abfd. + * exec.c (remove_target_sections): Delete arg abfd. + (exec_close): Update call to remove_target_sections. + * solib.c (update_solib_list): Ditto. + (reload_shared_libraries_1): Ditto. + (clear_solib): Ditto, and unconditionally call remove_target_sections. + 2013-07-22 Tom Tromey * solib-som.c (som_open_symbol_file_object): Call do_cleanups. diff --git a/gdb/exec.c b/gdb/exec.c index 5b256ef01f..14ff6d7b8c 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -101,7 +101,7 @@ exec_close (void) exec_bfd = NULL; exec_bfd_mtime = 0; - remove_target_sections (&exec_bfd, abfd); + remove_target_sections (&exec_bfd); } } @@ -339,7 +339,7 @@ add_to_section_table (bfd *abfd, struct bfd_section *asect, if (!(aflag & SEC_ALLOC)) return; - (*table_pp)->key = NULL; + (*table_pp)->owner = NULL; (*table_pp)->the_bfd_section = asect; (*table_pp)->addr = bfd_section_vma (abfd, asect); (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect); @@ -397,7 +397,7 @@ build_section_table (struct bfd *some_bfd, struct target_section **start, current set of target sections. */ void -add_target_sections (void *key, +add_target_sections (void *owner, struct target_section *sections, struct target_section *sections_end) { @@ -414,7 +414,7 @@ add_target_sections (void *key, for (i = 0; i < count; ++i) { table->sections[space + i] = sections[i]; - table->sections[space + i].key = key; + table->sections[space + i].owner = owner; } /* If these are the first file sections we can provide memory @@ -427,17 +427,20 @@ add_target_sections (void *key, } } -/* Remove all target sections taken from ABFD. */ +/* Remove all target sections owned by OWNER. + OWNER must be the same value passed to add_target_sections. */ void -remove_target_sections (void *key, bfd *abfd) +remove_target_sections (void *owner) { struct target_section *src, *dest; struct target_section_table *table = current_target_sections; + gdb_assert (owner != NULL); + dest = table->sections; for (src = table->sections; src < table->sections_end; src++) - if (src->key != key || src->the_bfd_section->owner != abfd) + if (src->owner != owner) { /* Keep this section. */ if (dest < src) diff --git a/gdb/exec.h b/gdb/exec.h index f5a4077ab3..21ccba8c68 100644 --- a/gdb/exec.h +++ b/gdb/exec.h @@ -81,14 +81,14 @@ extern int section_table_xfer_memory_partial (gdb_byte *, const gdb_byte *, /* Set the loaded address of a section. */ extern void exec_set_section_address (const char *, int, CORE_ADDR); -/* Remove all target sections taken from ABFD. */ +/* Remove all target sections owned by OWNER. */ -extern void remove_target_sections (void *key, bfd *abfd); +extern void remove_target_sections (void *owner); /* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the current set of target sections. */ -extern void add_target_sections (void *key, +extern void add_target_sections (void *owner, struct target_section *sections, struct target_section *sections_end); diff --git a/gdb/solib.c b/gdb/solib.c index c987fe5950..fd266876a7 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -770,7 +770,7 @@ update_solib_list (int from_tty, struct target_ops *target) /* Some targets' section tables might be referring to sections from so->abfd; remove them. */ - remove_target_sections (gdb, gdb->abfd); + remove_target_sections (gdb); free_so (gdb); gdb = *gdb_link; @@ -1151,8 +1151,7 @@ clear_solib (void) so_list_head = so->next; observer_notify_solib_unloaded (so); - if (so->abfd) - remove_target_sections (so, so->abfd); + remove_target_sections (so); free_so (so); } @@ -1276,7 +1275,7 @@ reload_shared_libraries_1 (int from_tty) if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED) && !solib_used (so)) free_objfile (so->objfile); - remove_target_sections (so, so->abfd); + remove_target_sections (so); clear_so (so); } diff --git a/gdb/target.h b/gdb/target.h index 21e5792ad7..9ea87bb7be 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1902,11 +1902,12 @@ struct target_section struct bfd_section *the_bfd_section; - /* A given BFD may appear multiple times in the target section - list, so each BFD is associated with a given key. The key is - just some convenient pointer that can be used to differentiate - the BFDs. These are managed only by convention. */ - void *key; + /* The "owner" of the section. + It can be any unique value. It is set by add_target_sections + and used by remove_target_sections. + For example, for executables it is a pointer to exec_bfd and + for shlibs it is the so_list pointer. */ + void *owner; }; /* Holds an array of target sections. Defined by [SECTIONS..SECTIONS_END[. */