From a4a38eb437382fbf2b2c6788fe35dd3340f9664a Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 14 Feb 2020 14:16:23 -0700 Subject: [PATCH] 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 * minidebug.c (gnu_debug_key): New global. (find_separate_debug_file_in_section): Use it. Change-Id: If139f89f0f07db33f399afdbcfbf5aaeffe4de46 --- gdb/ChangeLog | 5 +++++ gdb/minidebug.c | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b71251c6a20..fd9b6a85ea1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-02-14 Tom Tromey + + * minidebug.c (gnu_debug_key): New global. + (find_separate_debug_file_in_section): Use it. + 2020-02-14 Simon Marchi * gdbarch.sh (displaced_step_copy_insn): Change return type to an diff --git a/gdb/minidebug.c b/gdb/minidebug.c index a56a822628e..dbf14c79fb9 100644 --- a/gdb/minidebug.c +++ b/gdb/minidebug.c @@ -26,6 +26,10 @@ #ifdef HAVE_LIBLZMA +/* We stash a reference to the .gnu_debugdata BFD on the enclosing + BFD. */ +static const bfd_key gnu_debug_key; + #include /* Allocator function for LZMA. */ @@ -269,6 +273,10 @@ find_separate_debug_file_in_section (struct objfile *objfile) return NULL; #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"), 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")); return NULL; } + + gnu_debug_key.emplace (objfile->obfd, abfd); + #else warning (_("Cannot parse .gnu_debugdata section; LZMA support was " "disabled at compile time")); -- 2.30.2