Cache .gnu_debugdata BFD

Message ID 20200212001149.1458-1-tom@tromey.com
State New
Headers show
Series
  • Cache .gnu_debugdata BFD
Related show

Commit Message

Tom Tromey Feb. 12, 2020, 12:11 a.m.
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-11  Tom Tromey  <tom@tromey.com>

	* 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(+)

-- 
2.17.2

Comments

Luis Machado Feb. 14, 2020, 10:22 a.m. | #1
On 2/11/20 9:11 PM, Tom Tromey wrote:
> 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-11  Tom Tromey  <tom@tromey.com>

> 

> 	* 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/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<gdb_bfd_ref_ptr> gnu_debug_key;

> +

>   #include <lzma.h>

>   

>   /* 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"));

> 


Thanks. LGTM.

Patch

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<gdb_bfd_ref_ptr> gnu_debug_key;
+
 #include <lzma.h>
 
 /* 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"));