199 lines
6.6 KiB
Diff
199 lines
6.6 KiB
Diff
http://sourceware.org/ml/gdb-patches/2013-05/msg00627.html
|
||
Subject: [RFA 2/7] API for inhibiting section map updates
|
||
|
||
|
||
--bPg9NdpM9EETxvqt
|
||
Content-Type: text/plain; charset=us-ascii
|
||
Content-Disposition: inline
|
||
|
||
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.
|
||
|
||
--bPg9NdpM9EETxvqt
|
||
Content-Type: text/plain; charset=us-ascii
|
||
Content-Disposition: attachment; filename="rtld-probes-2-inhibit-sm-updates.patch"
|
||
|
||
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)
|
||
}
|
||
|
||
|
||
-/* 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"
|
||
|
||
--bPg9NdpM9EETxvqt--
|
||
|