Cache .gnu_debugdata BFD

While looking at the output of "maint info bfd" with multiple
inferiors, I noticed that there were duplicate entries for
.gnu_debugdata.

There is no reason to re-create this BFD each time it is needed.  This
patch arranges to share the data.

gdb/ChangeLog
2020-02-14  Tom Tromey  <tom@tromey.com>

	* minidebug.c (gnu_debug_key): New global.
	(find_separate_debug_file_in_section): Use it.

Change-Id: If139f89f0f07db33f399afdbcfbf5aaeffe4de46
This commit is contained in:
Tom Tromey 2020-02-14 14:16:23 -07:00
parent f251f50533
commit a4a38eb437
2 changed files with 16 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2020-02-14 Tom Tromey <tom@tromey.com>
* minidebug.c (gnu_debug_key): New global.
(find_separate_debug_file_in_section): Use it.
2020-02-14 Simon Marchi <simon.marchi@efficios.com> 2020-02-14 Simon Marchi <simon.marchi@efficios.com>
* gdbarch.sh (displaced_step_copy_insn): Change return type to an * gdbarch.sh (displaced_step_copy_insn): Change return type to an

View File

@ -26,6 +26,10 @@
#ifdef HAVE_LIBLZMA #ifdef HAVE_LIBLZMA
/* We stash a reference to the .gnu_debugdata BFD on the enclosing
BFD. */
static const bfd_key<gdb_bfd_ref_ptr> gnu_debug_key;
#include <lzma.h> #include <lzma.h>
/* Allocator function for LZMA. */ /* Allocator function for LZMA. */
@ -269,6 +273,10 @@ find_separate_debug_file_in_section (struct objfile *objfile)
return NULL; return NULL;
#ifdef HAVE_LIBLZMA #ifdef HAVE_LIBLZMA
gdb_bfd_ref_ptr *shared = gnu_debug_key.get (objfile->obfd);
if (shared != nullptr)
return *shared;
std::string filename = string_printf (_(".gnu_debugdata for %s"), std::string filename = string_printf (_(".gnu_debugdata for %s"),
objfile_name (objfile)); objfile_name (objfile));
@ -282,6 +290,9 @@ find_separate_debug_file_in_section (struct objfile *objfile)
warning (_("Cannot parse .gnu_debugdata section; not a BFD object")); warning (_("Cannot parse .gnu_debugdata section; not a BFD object"));
return NULL; return NULL;
} }
gnu_debug_key.emplace (objfile->obfd, abfd);
#else #else
warning (_("Cannot parse .gnu_debugdata section; LZMA support was " warning (_("Cannot parse .gnu_debugdata section; LZMA support was "
"disabled at compile time")); "disabled at compile time"));