[v2,09/13,gdb/symtab] Resolve deferred entries, intra-shard case
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
Commit Message
In patch "[gdb/symtab] Resolve deferred entries, inter-shard case" we've
solved the generic case of handling deferred entries.
Now add an optimization that handles deferred entries with an intra-shard
dependency in the parallel for.
Tested on x86_64-linux.
---
gdb/dwarf2/cooked-index.c | 35 +++++++++++++++++++++++++++++++++++
gdb/dwarf2/cooked-index.h | 7 +++++++
gdb/dwarf2/read.c | 10 ++++++++++
3 files changed, 52 insertions(+)
@@ -456,6 +456,7 @@ cooked_index_shard::wait (bool allow_quit) const
cooked_index::cooked_index (vec_type &&vec)
: m_vector (std::move (vec))
{
+ /* Handle deferred entries, inter-cu case. */
handle_deferred_entries ();
for (auto &idx : m_vector)
@@ -658,6 +659,40 @@ cooked_index::maybe_write_index (dwarf2_per_bfd *per_bfd,
/* See cooked-index.h. */
+const cooked_index_entry *
+cooked_index_shard::find_parent_deferred_entry
+ (const cooked_index_shard::deferred_entry &entry) const
+{
+ return find_parent (entry.spec_offset);
+}
+
+/* See cooked-index.h. */
+
+void
+cooked_index_shard::handle_deferred_entries ()
+{
+ for (auto it = m_deferred_entries->begin (); it != m_deferred_entries->end (); )
+ {
+ const deferred_entry & deferred_entry = *it;
+ if (!parent_valid (deferred_entry.spec_offset))
+ {
+ it++;
+ continue;
+ }
+ const cooked_index_entry *parent_entry
+ = find_parent_deferred_entry (deferred_entry);
+ if (parent_entry == &parent_map::deferred)
+ {
+ it++;
+ continue;
+ }
+ resolve_deferred_entry (deferred_entry, parent_entry);
+ it = m_deferred_entries->erase (it);
+ }
+}
+
+/* See cooked-index.h. */
+
const cooked_index_entry *
cooked_index_shard::resolve_deferred_entry
(const deferred_entry &de, const cooked_index_entry *parent_entry)
@@ -408,6 +408,13 @@ class cooked_index_shard
const cooked_index_entry *resolve_deferred_entry
(const deferred_entry &entry, const cooked_index_entry *parent_entry);
+ /* Find the parent entry for deferred_entry ENTRY. */
+ const cooked_index_entry *find_parent_deferred_entry
+ (const cooked_index_shard::deferred_entry &entry) const;
+
+ /* Create cooked_index_entries for the deferred entries. */
+ void handle_deferred_entries ();
+
/* Mark parents in range [START, END] as valid . */
void set_parent_valid (CORE_ADDR start, CORE_ADDR end)
{
@@ -4516,6 +4516,12 @@ class cooked_index_storage
m_index->defer_entry (de);
}
+ /* Handle deferred entries, intra-cu case. */
+ void handle_deferred_entries ()
+ {
+ m_index->handle_deferred_entries ();
+ }
+
/* Mark parents in range [START, END] as valid . */
void set_parent_valid (CORE_ADDR start, CORE_ADDR end)
{
@@ -5002,6 +5008,10 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile)
errors.push_back (std::move (except));
}
}
+
+ /* Handle deferred entries, intra-cu case. */
+ thread_storage.handle_deferred_entries ();
+
return result_type (thread_storage.release (), std::move (errors));
}, task_size);