[PATCH v2 41.5/42] Move line_header_hash to dwarf2_per_objfile

Simon Marchi
2020-05-27T14:50:16Z

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

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
--
2.26.2