[v2,41.5/42] Move line_header_hash to dwarf2_per_objfile

Message ID e7f45547-8218-aba6-3a65-78ddbf03e2e5@simark.ca
State New
Headers show
Series
  • [v2,41.5/42] Move line_header_hash to dwarf2_per_objfile
Related show

Commit Message

Simon Marchi May 27, 2020, 2:50 p.m.
Here's another patch, inserted between 41 and 42.


From 5b16dc91567e370a5eaffc27bf2a35eafd46ca93 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@efficios.com>

Date: Wed, 27 May 2020 01:20:50 -0400
Subject: [PATCH] Move line_header_hash to dwarf2_per_objfile

The `line_header_hash` field of `struct dwarf2_per_bfd` contains some
`struct line_header` objects.  A `struct line_header` objects contains
some `file_entry` objects.  A `file_entry` object contains a pointer to
the `symtab` object created from it.  The `line_header_hash` is
therefore ultimately objfile-dependent and can't be shared as-is between
objfiles.

Move it from `dwarf2_per_bfd` to `dwarf2_per_objfile`.

gdb/ChangeLog:

	* dwarf2/read.h (struct dwarf2_per_bfd) <line_header_hash>: Move
	to...
	(struct dwarf2_per_objfile) <line_header_hash>: ... here.
	* dwarf2/read.c (handle_DW_AT_stmt_list): Update.
---
 gdb/dwarf2/read.c | 12 ++++++------
 gdb/dwarf2/read.h |  6 +++---
 2 files changed, 9 insertions(+), 9 deletions(-)

-- 
2.26.2

Comments

Tom Tromey May 27, 2020, 3:07 p.m. | #1
>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:


Simon> The `line_header_hash` field of `struct dwarf2_per_bfd` contains some
Simon> `struct line_header` objects.  A `struct line_header` objects contains
Simon> some `file_entry` objects.  A `file_entry` object contains a pointer to
Simon> the `symtab` object created from it.  The `line_header_hash` is
Simon> therefore ultimately objfile-dependent and can't be shared as-is between
Simon> objfiles.

Simon> Move it from `dwarf2_per_bfd` to `dwarf2_per_objfile`.

This patch looks good.

I wonder how hard it would be to remove this symtab link and share these
across objfiles.  However, I don't think this is worth delaying the
series for.

Tom
H.J. Lu via Gdb-patches May 27, 2020, 3:10 p.m. | #2
On 2020-05-27 11:07 a.m., Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:

> 

> Simon> The `line_header_hash` field of `struct dwarf2_per_bfd` contains some

> Simon> `struct line_header` objects.  A `struct line_header` objects contains

> Simon> some `file_entry` objects.  A `file_entry` object contains a pointer to

> Simon> the `symtab` object created from it.  The `line_header_hash` is

> Simon> therefore ultimately objfile-dependent and can't be shared as-is between

> Simon> objfiles.

> 

> Simon> Move it from `dwarf2_per_bfd` to `dwarf2_per_objfile`.

> 

> This patch looks good.

> 

> I wonder how hard it would be to remove this symtab link and share these

> across objfiles.  However, I don't think this is worth delaying the

> series for.


Same.  I went for the obvious fix here, but once it's merged we can spend as much
time as we want to try to migrate stuff from dwarf2_per_objfile to dwarf2_per_bfd.

Thanks for the reviews!

Simon

Patch

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index df15068269c..c77c3562123 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -10888,10 +10888,10 @@  handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
      compile_unit, then use the line header hash table if it's already
      created, but don't create one just yet.  */

-  if (dwarf2_per_objfile->per_bfd->line_header_hash == NULL
+  if (dwarf2_per_objfile->line_header_hash == NULL
       && die->tag == DW_TAG_partial_unit)
     {
-      dwarf2_per_objfile->per_bfd->line_header_hash
+      dwarf2_per_objfile->line_header_hash
 	.reset (htab_create_alloc (127, line_header_hash_voidp,
 				   line_header_eq_voidp,
 				   free_line_header_voidp,
@@ -10901,9 +10901,9 @@  handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
   line_header_local.sect_off = line_offset;
   line_header_local.offset_in_dwz = cu->per_cu->is_dwz;
   line_header_local_hash = line_header_hash (&line_header_local);
-  if (dwarf2_per_objfile->per_bfd->line_header_hash != NULL)
+  if (dwarf2_per_objfile->line_header_hash != NULL)
     {
-      slot = htab_find_slot_with_hash (dwarf2_per_objfile->per_bfd->line_header_hash.get (),
+      slot = htab_find_slot_with_hash (dwarf2_per_objfile->line_header_hash.get (),
 				       &line_header_local,
 				       line_header_local_hash, NO_INSERT);

@@ -10927,11 +10927,11 @@  handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
   cu->line_header = lh.release ();
   cu->line_header_die_owner = die;

-  if (dwarf2_per_objfile->per_bfd->line_header_hash == NULL)
+  if (dwarf2_per_objfile->line_header_hash == NULL)
     slot = NULL;
   else
     {
-      slot = htab_find_slot_with_hash (dwarf2_per_objfile->per_bfd->line_header_hash.get (),
+      slot = htab_find_slot_with_hash (dwarf2_per_objfile->line_header_hash.get (),
 				       &line_header_local,
 				       line_header_local_hash, INSERT);
       gdb_assert (slot != NULL);
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 996cf55af22..b53aab7be63 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -234,9 +234,6 @@  struct dwarf2_per_bfd
   /* The CUs we recently read.  */
   std::vector<dwarf2_per_cu_data *> just_read_cus;

-  /* Table containing line_header indexed by offset and offset_in_dwz.  */
-  htab_up line_header_hash;
-
   /* Table containing all filenames.  This is an optional because the
      table is lazily constructed on first access.  */
   gdb::optional<filename_seen_cache> filenames_cache;
@@ -368,6 +365,9 @@  struct dwarf2_per_objfile
      The mapping is done via (CU/TU + DIE offset) -> type.  */
   htab_up die_type_hash;

+  /* Table containing line_header indexed by offset and offset_in_dwz.  */
+  htab_up line_header_hash;
+
 private:
   /* Hold the corresponding compunit_symtab for each CU or TU.  This
      is indexed by dwarf2_per_cu_data::index.  A NULL value means