Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Gary Benson <gbenson@redhat.com>
To: gdb-patches@sourceware.org
Subject: [RFA 2/7] API for inhibiting section map updates
Date: Thu, 16 May 2013 14:48:00 -0000	[thread overview]
Message-ID: <20130516144813.GC2105@blade.nx> (raw)
In-Reply-To: <20130516144340.GA2105@blade.nx>

[-- Attachment #1: Type: text/plain, Size: 433 bytes --]

This patch adds a couple of functions to allow section map updates
to be temporarily inhibited.  Without this ability, the calls to
evaluate_probe_argument in svr4_handle_solib_event trigger a section
map update every time a group of shared objects are mapped, which
significantly affects performance.  The updates are unnecessary in
this case as the sections in question are in the runtime linker and
so already in the section map.

[-- Attachment #2: rtld-probes-2-inhibit-sm-updates.patch --]
[-- Type: text/plain, Size: 5957 bytes --]

2013-05-16  Gary Benson  <gbenson@redhat.com>

	* 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..0b7eea9 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 (void);
+
+/* Resume automatically rebuilding the section map as required.  */
+extern void resume_section_map_updates (void);
+
+/* 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..3af1064 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)
 }
 \f
 
-/* 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 (void)
+{
+  get_objfile_pspace_data (current_program_space)->inhibit_updates = 1;
+}
+
+/* See comments in objfiles.h.  */
+
+void
+resume_section_map_updates (void)
+{
+  get_objfile_pspace_data (current_program_space)->inhibit_updates = 0;
+}
+
+/* See comments in objfiles.h.  */
+
+void
+resume_section_map_updates_cleanup (void *arg)
+{
+  resume_section_map_updates ();
 }
 
 /* The default implementation for the "iterate_over_objfiles_in_search_order"

  parent reply	other threads:[~2013-05-16 14:48 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-16 14:43 [RFA 0/7] Improved linker-debugger interface Gary Benson
2013-05-16 14:47 ` [RFA 1/7] Probes API convenience patch Gary Benson
2013-05-16 14:48 ` [RFA 4/7] GDB support for new gdbserver functionality Gary Benson
2013-05-16 14:48 ` [RFA 3/7] New " Gary Benson
2013-05-16 18:18   ` Tom Tromey
2013-05-24  7:46     ` [RFA 3/7 take 2] " Gary Benson
2013-05-25 21:05       ` Jan Kratochvil
2013-05-26  2:45         ` Eli Zaretskii
2013-05-29 18:50       ` Pedro Alves
2013-05-30  9:38         ` Gary Benson
2013-05-30 10:40           ` Pedro Alves
2013-05-30 10:54             ` Gary Benson
2013-05-30 16:31               ` Eli Zaretskii
2013-05-30 17:22                 ` Gary Benson
2013-05-16 14:48 ` Gary Benson [this message]
2013-05-20 14:22   ` [RFA 2/7] API for inhibiting section map updates Tom Tromey
2013-05-24  7:47     ` [RFA 2/7 take 2] " Gary Benson
2013-05-24 14:18       ` Tom Tromey
2013-05-29 17:18       ` Pedro Alves
2013-05-30  9:12         ` Gary Benson
2013-05-16 14:55 ` [RFA 6/7] Linker-debugger interface tests by Jan Gary Benson
2013-05-29 19:06   ` Pedro Alves
2013-05-30  9:19     ` Gary Benson
2013-05-16 14:55 ` [RFA 5/7] Improved linker-debugger interface Gary Benson
2013-05-17 19:05   ` Jan Kratochvil
2013-05-24  8:30     ` [RFA 5/7 take 2] " Gary Benson
2013-05-25 21:05       ` Jan Kratochvil
2013-05-29 18:51       ` Pedro Alves
2013-05-30 10:43         ` [RFA 5/7 take 3] " Gary Benson
2013-05-30 17:18           ` Pedro Alves
2013-05-31 13:22             ` [RFA 5/7 take 4] " Gary Benson
2013-05-31 13:27               ` Pedro Alves
2013-06-03 10:31               ` Pedro Alves
2013-06-03 16:37               ` Jan Kratochvil
2013-06-03 17:28                 ` Pedro Alves
2013-06-04 11:33                   ` Gary Benson
2013-05-16 14:55 ` [RFA 7/7] Linker-debugger interface tests Gary Benson
2013-05-19 13:45   ` Jan Kratochvil
2013-05-19 16:43     ` Jan Kratochvil
2013-05-24  8:38     ` [RFA 7/7 take 2] " Gary Benson
2013-05-24  8:58       ` Jan Kratochvil
2013-05-24 14:05         ` [obv] Fix excessive backslashes in testsuite Gary Benson
2013-05-25 21:06       ` [RFA 7/7 take 2] Linker-debugger interface tests Jan Kratochvil
2013-05-16 17:33 ` [RFA 0/7] Improved linker-debugger interface Tom Tromey
2013-05-16 18:53   ` Gary Benson
2013-06-06  9:00   ` Gary Benson
2013-05-19 13:46 ` Jan Kratochvil
2013-05-29 19:08 ` Pedro Alves
2013-06-04 13:38 ` [commit] " Gary Benson
2013-06-25 21:04   ` Joel Brobecker
2013-06-25 22:03     ` Sergio Durigan Junior
2013-06-26  0:49       ` Joel Brobecker
2013-07-09  8:41         ` Gary Benson
     [not found]         ` <20130708104719.GA11176@blade.nx>
2013-07-09 14:45           ` Joel Brobecker
2013-06-26 15:38       ` Tom Tromey
2013-06-26 17:23         ` Sergio Durigan Junior
2013-06-26 19:15           ` Joel Brobecker
2013-06-27 23:33           ` Tom Tromey
2013-06-30  3:12             ` Sergio Durigan Junior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130516144813.GC2105@blade.nx \
    --to=gbenson@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox