From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27570 invoked by alias); 24 May 2013 07:47:41 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 27561 invoked by uid 89); 24 May 2013 07:47:41 -0000 X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,TW_BJ autolearn=ham version=3.3.1 Received: from gbenson.demon.co.uk (HELO blade.nx) (80.177.220.214) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 24 May 2013 07:47:40 +0000 Received: by blade.nx (Postfix, from userid 500) id B94F226424D; Fri, 24 May 2013 08:47:37 +0100 (BST) Date: Fri, 24 May 2013 07:47:00 -0000 From: Gary Benson To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: [RFA 2/7 take 2] API for inhibiting section map updates Message-ID: <20130524074737.GB4602@blade.nx> Mail-Followup-To: Tom Tromey , gdb-patches@sourceware.org References: <20130516144340.GA2105@blade.nx> <20130516144813.GC2105@blade.nx> <87mwrpohnv.fsf@fleche.redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="mvpLiMfbWzRoNl4x" Content-Disposition: inline In-Reply-To: <87mwrpohnv.fsf@fleche.redhat.com> X-Virus-Found: No X-SW-Source: 2013-05/txt/msg00911.txt.bz2 --mvpLiMfbWzRoNl4x Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1028 Tom Tromey wrote: > >>>>> "Gary" == Gary Benson writes: > > Gary> +void > Gary> +inhibit_section_map_updates (void) > Gary> +{ > Gary> + get_objfile_pspace_data (current_program_space)->inhibit_updates = 1; > Gary> +} > Gary> + > Gary> +/* See comments in objfiles.h. */ > Gary> + > Gary> +void > Gary> +resume_section_map_updates (void) > Gary> +{ > Gary> + get_objfile_pspace_data (current_program_space)->inhibit_updates = 0; > Gary> +} > Gary> + > Gary> +/* See comments in objfiles.h. */ > Gary> + > Gary> +void > Gary> +resume_section_map_updates_cleanup (void *arg) > Gary> +{ > Gary> + resume_section_map_updates (); > Gary> } > > It seems like it might be slightly safer if these all took the > program space as an argument. That way if something happens to > change the current program space, then, e.g., the cleanup will > still affect the program space for which it was made. > > What do you think of that? That's an excellent idea. The attached patch implements this. Cheers, Gary --mvpLiMfbWzRoNl4x Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="rtld-probes-2-inhibit-sm-updates.patch" Content-length: 6026 2013-05-23 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. diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 93149e2..adb1ef8 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, diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 3e49ea2..8842131 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 (current_program_space); + 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" --mvpLiMfbWzRoNl4x--