diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d00c88baf0..c5c6db216f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2013-06-04 Gary Benson + + * objfiles.h (inhibit_section_map_updates): New function + declaration. + (resume_section_map_updates): Likewise. + (resume_section_map_updates_cleanup): Likewise. + * objfiles.c (objfile_pspace_info): Removed field + "objfiles_changed_p". New fields "new_objfiles_available", + "section_map_dirty" and "inhibit_updates". + (allocate_objfile): Set new_objfiles_available. + (free_objfile): Set section_map_dirty. + (objfile_relocate1): Likewise. + (in_plt_section): Likewise. + (find_pc_section): Update the conditions under which the + section map will be updated. + (inhibit_section_map_updates): New function. + (resume_section_map_updates): Likewise. + (resume_section_map_updates_cleanup): Likewise. + 2013-06-04 Gary Benson * probe.h (get_probe_argument_count): New declaration. diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 3e49ea26d8..1e1b7bcc9f 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -67,9 +67,18 @@ struct objfile *rt_common_objfile; /* For runtime common symbols */ struct objfile_pspace_info { - int objfiles_changed_p; struct obj_section **sections; int num_sections; + + /* Nonzero if object files have been added since the section map + was last updated. */ + int new_objfiles_available; + + /* Nonzero if the section map MUST be updated before use. */ + int section_map_dirty; + + /* Nonzero if section map updates should be inhibited if possible. */ + int inhibit_updates; }; /* Per-program-space data key. */ @@ -317,7 +326,7 @@ allocate_objfile (bfd *abfd, int flags) objfile->flags |= flags; /* Rebuild section map next time we need it. */ - get_objfile_pspace_data (objfile->pspace)->objfiles_changed_p = 1; + get_objfile_pspace_data (objfile->pspace)->new_objfiles_available = 1; return objfile; } @@ -646,7 +655,7 @@ free_objfile (struct objfile *objfile) obstack_free (&objfile->objfile_obstack, 0); /* Rebuild section map next time we need it. */ - get_objfile_pspace_data (objfile->pspace)->objfiles_changed_p = 1; + get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1; xfree (objfile); } @@ -826,7 +835,7 @@ objfile_relocate1 (struct objfile *objfile, } /* Rebuild section map next time we need it. */ - get_objfile_pspace_data (objfile->pspace)->objfiles_changed_p = 1; + get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1; /* Update the table in exec_ops, used to read memory. */ ALL_OBJFILE_OSECTIONS (objfile, s) @@ -1291,11 +1300,14 @@ static void update_section_map (struct program_space *pspace, struct obj_section ***pmap, int *pmap_size) { + struct objfile_pspace_info *pspace_info; int alloc_size, map_size, i; struct obj_section *s, **map; struct objfile *objfile; - gdb_assert (get_objfile_pspace_data (pspace)->objfiles_changed_p != 0); + pspace_info = get_objfile_pspace_data (pspace); + gdb_assert (pspace_info->section_map_dirty != 0 + || pspace_info->new_objfiles_available != 0); map = *pmap; xfree (map); @@ -1365,7 +1377,9 @@ find_pc_section (CORE_ADDR pc) return s; pspace_info = get_objfile_pspace_data (current_program_space); - if (pspace_info->objfiles_changed_p != 0) + if (pspace_info->section_map_dirty + || (pspace_info->new_objfiles_available + && !pspace_info->inhibit_updates)) { update_section_map (current_program_space, &pspace_info->sections, @@ -1373,7 +1387,8 @@ find_pc_section (CORE_ADDR pc) /* Don't need updates to section map until objfiles are added, removed or relocated. */ - pspace_info->objfiles_changed_p = 0; + pspace_info->new_objfiles_available = 0; + pspace_info->section_map_dirty = 0; } /* The C standard (ISO/IEC 9899:TC2) requires the BASE argument to @@ -1414,14 +1429,38 @@ in_plt_section (CORE_ADDR pc, char *name) } -/* Set objfiles_changed_p so section map will be rebuilt next time it +/* Set section_map_dirty so section map will be rebuilt next time it is used. Called by reread_symbols. */ void objfiles_changed (void) { /* Rebuild section map next time we need it. */ - get_objfile_pspace_data (current_program_space)->objfiles_changed_p = 1; + get_objfile_pspace_data (current_program_space)->section_map_dirty = 1; +} + +/* See comments in objfiles.h. */ + +void +inhibit_section_map_updates (struct program_space *pspace) +{ + get_objfile_pspace_data (pspace)->inhibit_updates = 1; +} + +/* See comments in objfiles.h. */ + +void +resume_section_map_updates (struct program_space *pspace) +{ + get_objfile_pspace_data (pspace)->inhibit_updates = 0; +} + +/* See comments in objfiles.h. */ + +void +resume_section_map_updates_cleanup (void *arg) +{ + resume_section_map_updates (arg); } /* The default implementation for the "iterate_over_objfiles_in_search_order" diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 93149e2032..adb1ef8d3c 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -501,6 +501,22 @@ extern int in_plt_section (CORE_ADDR, char *); modules. */ DECLARE_REGISTRY(objfile); +/* In normal use, the section map will be rebuilt by find_pc_section + if objfiles have been added, removed or relocated since it was last + called. Calling inhibit_section_map_updates will inhibit this + behavior until resume_section_map_updates is called. If you call + inhibit_section_map_updates you must ensure that every call to + find_pc_section in the inhibited region relates to a section that + is already in the section map and has not since been removed or + relocated. */ +extern void inhibit_section_map_updates (struct program_space *pspace); + +/* Resume automatically rebuilding the section map as required. */ +extern void resume_section_map_updates (struct program_space *pspace); + +/* Version of the above suitable for use as a cleanup. */ +extern void resume_section_map_updates_cleanup (void *arg); + extern void default_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb,