152 lines
5.1 KiB
Diff
152 lines
5.1 KiB
Diff
From b2f260d117dc11b8e90d4e9bf7f4b2cbd63d1d49 Mon Sep 17 00:00:00 2001
|
|
From: Tom de Vries <tdevries@suse.de>
|
|
Date: Tue, 22 Aug 2023 13:17:47 +0200
|
|
Subject: [PATCH 02/13] [gdb/symtab] Factor out m_die_range_map usage
|
|
|
|
Factor out usage of cooked_indexer::m_die_range_map into new class parent_map
|
|
with member functions find_parent and set_parent, and static member function
|
|
form_addr.
|
|
|
|
Tested on x86_64-linux.
|
|
---
|
|
gdb/dwarf2/cooked-index.h | 32 +++++++++++++++++++++++++++
|
|
gdb/dwarf2/read.c | 46 ++++++++++++++++++++-------------------
|
|
2 files changed, 56 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h
|
|
index 5aacb321c91..979541fbf60 100644
|
|
--- a/gdb/dwarf2/cooked-index.h
|
|
+++ b/gdb/dwarf2/cooked-index.h
|
|
@@ -239,6 +239,38 @@ struct cooked_index_entry : public allocate_on_obstack
|
|
bool for_name) const;
|
|
};
|
|
|
|
+class parent_map
|
|
+{
|
|
+public:
|
|
+ /* A helper function to turn a section offset into an address that
|
|
+ can be used in a parent_map. */
|
|
+ static CORE_ADDR form_addr (sect_offset offset, bool is_dwz)
|
|
+ {
|
|
+ CORE_ADDR value = to_underlying (offset);
|
|
+ if (is_dwz)
|
|
+ value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 1);
|
|
+ return value;
|
|
+ }
|
|
+
|
|
+ /* Find the parent of DIE LOOKUP. */
|
|
+ const cooked_index_entry *find_parent (CORE_ADDR lookup) const
|
|
+ {
|
|
+ const void *obj = m_parent_map.find (lookup);
|
|
+ return static_cast<const cooked_index_entry *> (obj);
|
|
+ }
|
|
+
|
|
+ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */
|
|
+ void set_parent (CORE_ADDR start, CORE_ADDR end,
|
|
+ const cooked_index_entry *parent_entry)
|
|
+ {
|
|
+ m_parent_map.set_empty (start, end, (void *)parent_entry);
|
|
+ }
|
|
+
|
|
+private:
|
|
+ /* An addrmap that maps from section offsets to cooked_index_entry *. */
|
|
+ addrmap_mutable m_parent_map;
|
|
+};
|
|
+
|
|
class cooked_index;
|
|
|
|
/* An index of interesting DIEs. This is "cooked", in contrast to a
|
|
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
|
index 466d3e59878..d48f3010063 100644
|
|
--- a/gdb/dwarf2/read.c
|
|
+++ b/gdb/dwarf2/read.c
|
|
@@ -4722,16 +4722,6 @@ class cooked_indexer
|
|
|
|
private:
|
|
|
|
- /* A helper function to turn a section offset into an address that
|
|
- can be used in an addrmap. */
|
|
- CORE_ADDR form_addr (sect_offset offset, bool is_dwz)
|
|
- {
|
|
- CORE_ADDR value = to_underlying (offset);
|
|
- if (is_dwz)
|
|
- value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 1);
|
|
- return value;
|
|
- }
|
|
-
|
|
/* A helper function to scan the PC bounds of READER and record them
|
|
in the storage's addrmap. */
|
|
void check_bounds (cutu_reader *reader);
|
|
@@ -4799,7 +4789,20 @@ class cooked_indexer
|
|
/* An addrmap that maps from section offsets (see the form_addr
|
|
method) to newly-created entries. See m_deferred_entries to
|
|
understand this. */
|
|
- addrmap_mutable m_die_range_map;
|
|
+ parent_map m_die_range_map;
|
|
+
|
|
+ /* Find the parent of DIE LOOKUP. */
|
|
+ const cooked_index_entry *find_parent (CORE_ADDR lookup) const
|
|
+ {
|
|
+ return m_die_range_map.find_parent (lookup);
|
|
+ }
|
|
+
|
|
+ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */
|
|
+ void set_parent (CORE_ADDR start, CORE_ADDR end,
|
|
+ const cooked_index_entry *parent_entry)
|
|
+ {
|
|
+ m_die_range_map.set_parent (start, end, parent_entry);
|
|
+ }
|
|
|
|
/* A single deferred entry. */
|
|
struct deferred_entry
|
|
@@ -16412,15 +16415,13 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu,
|
|
|
|
if (*parent_entry == nullptr)
|
|
{
|
|
- CORE_ADDR addr = form_addr (origin_offset, origin_is_dwz);
|
|
+ CORE_ADDR addr
|
|
+ = parent_map::form_addr (origin_offset, origin_is_dwz);
|
|
if (new_reader->cu == reader->cu
|
|
&& new_info_ptr > watermark_ptr)
|
|
*maybe_defer = addr;
|
|
else
|
|
- {
|
|
- void *obj = m_die_range_map.find (addr);
|
|
- *parent_entry = static_cast <cooked_index_entry *> (obj);
|
|
- }
|
|
+ *parent_entry = find_parent (addr);
|
|
}
|
|
|
|
unsigned int bytes_read;
|
|
@@ -16538,11 +16539,13 @@ cooked_indexer::recurse (cutu_reader *reader,
|
|
{
|
|
/* Both start and end are inclusive, so use both "+ 1" and "- 1" to
|
|
limit the range to the children of parent_entry. */
|
|
- CORE_ADDR start = form_addr (parent_entry->die_offset + 1,
|
|
- reader->cu->per_cu->is_dwz);
|
|
- CORE_ADDR end = form_addr (sect_offset (info_ptr - 1 - reader->buffer),
|
|
+ CORE_ADDR start
|
|
+ = parent_map::form_addr (parent_entry->die_offset + 1,
|
|
+ reader->cu->per_cu->is_dwz);
|
|
+ CORE_ADDR end
|
|
+ = parent_map::form_addr (sect_offset (info_ptr - 1 - reader->buffer),
|
|
reader->cu->per_cu->is_dwz);
|
|
- m_die_range_map.set_empty (start, end, (void *) parent_entry);
|
|
+ set_parent (start, end, parent_entry);
|
|
}
|
|
|
|
return info_ptr;
|
|
@@ -16715,8 +16718,7 @@ cooked_indexer::make_index (cutu_reader *reader)
|
|
|
|
for (const auto &entry : m_deferred_entries)
|
|
{
|
|
- void *obj = m_die_range_map.find (entry.spec_offset);
|
|
- cooked_index_entry *parent = static_cast<cooked_index_entry *> (obj);
|
|
+ const cooked_index_entry *parent = find_parent (entry.spec_offset);
|
|
m_index_storage->add (entry.die_offset, entry.tag, entry.flags,
|
|
entry.name, parent, m_per_cu);
|
|
}
|
|
--
|
|
2.35.3
|
|
|