summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/dwarf2/read.c22
-rw-r--r--gdb/objfiles.h6
-rw-r--r--gdb/psympriv.h2
-rw-r--r--gdb/psymtab.c18
-rw-r--r--gdb/quick-symbol.h6
-rw-r--r--gdb/symfile-debug.c25
7 files changed, 95 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9613e3e02ca..310c506e4e9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
+ * dwarf2/read.c (struct dwarf2_base_index_functions)
+ <has_unexpanded_symtabs>: Declare.
+ (dwarf2_base_index_functions::has_unexpanded_symtabs): Define new
+ function.
+ * objfiles.h (struct objfile) <has_unexpanded_symtabs>: Declare.
+ * psympriv.h (struct psymbol_functions) <has_unexpanded_symtabs>:
+ Declare.
+ * psymtab.c (psymbol_functions::has_unexpanded_symtabs): Define
+ new function.
+ * quick-symbol.h (struct quick_symbol_functions)
+ <has_unexpanded_symtabs>: Declare.
+ * symfile-debug.c (objfile::has_unexpanded_symtabs): Define new
+ function.
+
+2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
+
* infcall.c (call_function_by_hand_dummy): Add missing 'else' when
setting prototyped flag.
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 671c607a3b3..760d4319c29 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2024,6 +2024,8 @@ struct dwarf2_base_index_functions : public quick_symbol_functions
{
bool has_symbols (struct objfile *objfile) override;
+ bool has_unexpanded_symtabs (struct objfile *objfile) override;
+
struct symtab *find_last_source_symtab (struct objfile *objfile) override;
void forget_cached_source_info (struct objfile *objfile) override;
@@ -4470,6 +4472,26 @@ dwarf2_base_index_functions::has_symbols (struct objfile *objfile)
return true;
}
+/* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
+
+bool
+dwarf2_base_index_functions::has_unexpanded_symtabs (struct objfile *objfile)
+{
+ dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
+
+ for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
+ {
+ /* Is this already expanded? */
+ if (per_objfile->symtab_set_p (per_cu.get ()))
+ continue;
+
+ /* It has not yet been expanded. */
+ return true;
+ }
+
+ return false;
+}
+
/* DWARF-5 debug_names reader. */
/* DWARF-5 augmentation string for GDB's DW_IDX_GNU_* extension. */
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 5a8a782a646..f947d699132 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -565,6 +565,12 @@ public:
bool has_partial_symbols ();
+ /* Return true if this objfile has any unexpanded symbols. A return
+ value of false indicates either, that this objfile has all its
+ symbols fully expanded (i.e. fully read in), or that this objfile has
+ no symbols at all (i.e. no debug information). */
+ bool has_unexpanded_symtabs ();
+
/* See quick_symbol_functions. */
struct symtab *find_last_source_symtab ();
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 59dd66f57e5..3e51b972413 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -503,6 +503,8 @@ struct psymbol_functions : public quick_symbol_functions
bool has_symbols (struct objfile *objfile) override;
+ bool has_unexpanded_symtabs (struct objfile *objfile) override;
+
struct symtab *find_last_source_symtab (struct objfile *objfile) override;
void forget_cached_source_info (struct objfile *objfile) override;
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index cbd21b3209f..069052d712c 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1184,6 +1184,24 @@ psymbol_functions::has_symbols (struct objfile *objfile)
return m_partial_symtabs->psymtabs != NULL;
}
+/* See quick_symbol_functions::has_unexpanded_symtabs in quick-symbol.h. */
+
+bool
+psymbol_functions::has_unexpanded_symtabs (struct objfile *objfile)
+{
+ for (partial_symtab *psymtab : require_partial_symbols (objfile))
+ {
+ /* Is this already expanded? */
+ if (psymtab->readin_p (objfile))
+ continue;
+
+ /* It has not yet been expanded. */
+ return true;
+ }
+
+ return false;
+}
+
/* Helper function for psym_find_compunit_symtab_by_address that fills
in m_psymbol_map for a given range of psymbols. */
diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h
index f06ceff41c2..7af0aebb9fe 100644
--- a/gdb/quick-symbol.h
+++ b/gdb/quick-symbol.h
@@ -86,6 +86,12 @@ struct quick_symbol_functions
available. */
virtual bool has_symbols (struct objfile *objfile) = 0;
+ /* Return true if OBJFILE has any unexpanded symtabs. A return value of
+ false indicates there are no unexpanded symtabs, this might mean that
+ all of the symtabs have been expanded (full debug has been read in),
+ or it might been that OBJFILE has no debug information. */
+ virtual bool has_unexpanded_symtabs (struct objfile *objfile) = 0;
+
/* Return the symbol table for the "last" file appearing in
OBJFILE. */
virtual struct symtab *find_last_source_symtab (struct objfile *objfile) = 0;
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index b839194e2f7..a10af68f5b1 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -100,6 +100,31 @@ objfile::has_partial_symbols ()
return retval;
}
+/* See objfiles.h. */
+bool
+objfile::has_unexpanded_symtabs ()
+{
+ if (debug_symfile)
+ fprintf_filtered (gdb_stdlog, "qf->has_unexpanded_symtabs (%s)\n",
+ objfile_debug_name (this));
+
+ bool result = false;
+ for (const auto &iter : qf)
+ {
+ if (iter->has_unexpanded_symtabs (this))
+ {
+ result = true;
+ break;
+ }
+ }
+
+ if (debug_symfile)
+ fprintf_filtered (gdb_stdlog, "qf->has_unexpanded_symtabs (%s) = %d\n",
+ objfile_debug_name (this), (result ? 1 : 0));
+
+ return result;
+}
+
struct symtab *
objfile::find_last_source_symtab ()
{