X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fpsymtab.c;h=b9b7c7d06b246aed127f243089d1fdb06637db46;hb=84d865e39c3739097d7a3481b9c9b6b6fecb2b06;hp=118dc570e7cb60ebd56799e60f2da783d740038e;hpb=2467f4f6a533a28047e0b45ce716b9b1f9f72a09;p=binutils-gdb.git diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 118dc570e7c..b9b7c7d06b2 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1,6 +1,6 @@ /* Partial symbol tables. - Copyright (C) 2009-2020 Free Software Foundation, Inc. + Copyright (C) 2009-2021 Free Software Foundation, Inc. This file is part of GDB. @@ -53,16 +53,6 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *, static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst); - - -static unsigned long psymbol_hash (const void *addr, int length); -static int psymbol_compare (const void *addr1, const void *addr2, int length); - -psymtab_storage::psymtab_storage () - : psymbol_cache (psymbol_hash, psymbol_compare) -{ -} - psymtab_storage::~psymtab_storage () { partial_symtab *iter = psymtabs; @@ -85,34 +75,16 @@ psymtab_storage::install_psymtab (partial_symtab *pst) -/* See psymtab.h. */ +/* Ensure that the partial symbols for OBJFILE have been loaded. This + will print a message when symbols are loaded. This function + returns a range adapter suitable for iterating over the psymtabs of + OBJFILE. */ psymtab_storage::partial_symtab_range -require_partial_symbols (struct objfile *objfile, bool verbose) +psymbol_functions::require_partial_symbols (struct objfile *objfile) { - if ((objfile->flags & OBJF_PSYMTABS_READ) == 0) - { - objfile->flags |= OBJF_PSYMTABS_READ; - - if (objfile->sf->sym_read_psymbols) - { - if (verbose) - printf_filtered (_("Reading symbols from %s...\n"), - objfile_name (objfile)); - (*objfile->sf->sym_read_psymbols) (objfile); - - /* Partial symbols list are not expected to changed after this - point. */ - objfile->partial_symtabs->global_psymbols.shrink_to_fit (); - objfile->partial_symtabs->static_psymbols.shrink_to_fit (); - - if (verbose && !objfile_has_symbols (objfile)) - printf_filtered (_("(No debugging symbols found in %s)\n"), - objfile_name (objfile)); - } - } - - return objfile->psymtabs (); + objfile->require_partial_symbols (true); + return m_partial_symtabs->range (); } /* Helper function for psym_map_symtabs_matching_filename that @@ -132,7 +104,7 @@ partial_map_expand_apply (struct objfile *objfile, gdb_assert (pst->user == NULL); /* Don't visit already-expanded psymtabs. */ - if (pst->readin_p ()) + if (pst->readin_p (objfile)) return 0; /* This may expand more than one symtab, and we want to iterate over @@ -146,8 +118,8 @@ partial_map_expand_apply (struct objfile *objfile, /* Psymtab version of map_symtabs_matching_filename. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static bool -psym_map_symtabs_matching_filename +bool +psymbol_functions::map_symtabs_matching_filename (struct objfile *objfile, const char *name, const char *real_path, @@ -155,7 +127,7 @@ psym_map_symtabs_matching_filename { const char *name_basename = lbasename (name); - for (partial_symtab *pst : require_partial_symbols (objfile, true)) + for (partial_symtab *pst : require_partial_symbols (objfile)) { /* Anonymous psymtabs don't have a file name. */ if (pst->anonymous) @@ -283,15 +255,13 @@ find_pc_sect_psymtab_closer (struct objfile *objfile, return best_pst; } -/* Find which partial symtab contains PC and SECTION. Return NULL if - none. We return the psymtab that contains a symbol whose address - exactly matches PC, or, if we cannot find an exact match, the - psymtab that contains a symbol whose address is closest to PC. */ +/* See psympriv.h. */ -static struct partial_symtab * -find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, - struct obj_section *section, - struct bound_minimal_symbol msymbol) +struct partial_symtab * +psymbol_functions::find_pc_sect_psymtab (struct objfile *objfile, + CORE_ADDR pc, + struct obj_section *section, + struct bound_minimal_symbol msymbol) { /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity than the later used TEXTLOW/TEXTHIGH one. However, we need @@ -305,14 +275,14 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, partial symtabs then we will end up returning a pointer to an object that is not a partial_symtab, which doesn't end well. */ - if (objfile->partial_symtabs->psymtabs != NULL - && objfile->partial_symtabs->psymtabs_addrmap != NULL) + if (m_partial_symtabs->psymtabs != NULL + && m_partial_symtabs->psymtabs_addrmap != NULL) { CORE_ADDR baseaddr = objfile->text_section_offset (); struct partial_symtab *pst = ((struct partial_symtab *) - addrmap_find (objfile->partial_symtabs->psymtabs_addrmap, + addrmap_find (m_partial_symtabs->psymtabs_addrmap, pc - baseaddr)); if (pst != NULL) { @@ -355,7 +325,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying debug info type in single OBJFILE. */ - for (partial_symtab *pst : require_partial_symbols (objfile, true)) + for (partial_symtab *pst : require_partial_symbols (objfile)) if (!pst->psymtabs_addrmap_supported && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile)) { @@ -373,18 +343,20 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, /* Psymtab version of find_pc_sect_compunit_symtab. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static struct compunit_symtab * -psym_find_pc_sect_compunit_symtab (struct objfile *objfile, - struct bound_minimal_symbol msymbol, - CORE_ADDR pc, - struct obj_section *section, - int warn_if_readin) +struct compunit_symtab * +psymbol_functions::find_pc_sect_compunit_symtab + (struct objfile *objfile, + struct bound_minimal_symbol msymbol, + CORE_ADDR pc, + struct obj_section *section, + int warn_if_readin) { - struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section, + struct partial_symtab *ps = find_pc_sect_psymtab (objfile, + pc, section, msymbol); if (ps != NULL) { - if (warn_if_readin && ps->readin_p ()) + if (warn_if_readin && ps->readin_p (objfile)) /* Might want to error() here (in case symtab is corrupt and will cause a core dump), but maybe we can successfully continue, so let's not. */ @@ -392,7 +364,7 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile, (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), paddress (objfile->arch (), pc)); psymtab_to_symtab (objfile, ps); - return ps->get_compunit_symtab (); + return ps->get_compunit_symtab (objfile); } return NULL; } @@ -417,12 +389,8 @@ find_pc_sect_psymbol (struct objfile *objfile, /* Search the global symbols as well as the static symbols, so that find_pc_partial_function doesn't use a minimal symbol and thus cache a bad endaddr. */ - for (int i = 0; i < psymtab->n_global_syms; i++) + for (partial_symbol *p : psymtab->global_psymbols) { - partial_symbol *p - = objfile->partial_symtabs->global_psymbols[psymtab->globals_offset - + i]; - if (p->domain == VAR_DOMAIN && p->aclass == LOC_BLOCK && pc >= p->address (objfile) @@ -441,12 +409,8 @@ find_pc_sect_psymbol (struct objfile *objfile, } } - for (int i = 0; i < psymtab->n_static_syms; i++) + for (partial_symbol *p : psymtab->static_psymbols) { - partial_symbol *p - = objfile->partial_symtabs->static_psymbols[psymtab->statics_offset - + i]; - if (p->domain == VAR_DOMAIN && p->aclass == LOC_BLOCK && pc >= p->address (objfile) @@ -468,63 +432,14 @@ find_pc_sect_psymbol (struct objfile *objfile, return best; } -/* Psymtab version of lookup_symbol. See its definition in - the definition of quick_symbol_functions in symfile.h. */ - -static struct compunit_symtab * -psym_lookup_symbol (struct objfile *objfile, - block_enum block_index, const char *name, - const domain_enum domain) -{ - const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); - struct compunit_symtab *stab_best = NULL; - - lookup_name_info lookup_name (name, symbol_name_match_type::FULL); - - lookup_name_info psym_lookup_name = lookup_name.make_ignore_params (); - - for (partial_symtab *ps : require_partial_symbols (objfile, true)) - { - if (!ps->readin_p () && lookup_partial_symbol (objfile, ps, - psym_lookup_name, - psymtab_index, domain)) - { - struct symbol *sym, *with_opaque = NULL; - struct compunit_symtab *stab = psymtab_to_symtab (objfile, ps); - /* Note: While psymtab_to_symtab can return NULL if the - partial symtab is empty, we can assume it won't here - because lookup_partial_symbol succeeded. */ - const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab); - const struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); - - sym = block_find_symbol (block, name, domain, - block_find_non_opaque_type_preferred, - &with_opaque); - - /* Some caution must be observed with overloaded functions - and methods, since the index will not contain any overload - information (but NAME might contain it). */ - - if (sym != NULL - && SYMBOL_MATCHES_SEARCH_NAME (sym, lookup_name)) - return stab; - if (with_opaque != NULL - && SYMBOL_MATCHES_SEARCH_NAME (with_opaque, lookup_name)) - stab_best = stab; - - /* Keep looking through other psymtabs. */ - } - } - - return stab_best; -} - /* Psymtab version of lookup_global_symbol_language. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static enum language -psym_lookup_global_symbol_language (struct objfile *objfile, const char *name, - domain_enum domain, bool *symbol_found_p) +enum language +psymbol_functions::lookup_global_symbol_language (struct objfile *objfile, + const char *name, + domain_enum domain, + bool *symbol_found_p) { *symbol_found_p = false; if (objfile->sf == NULL) @@ -532,10 +447,10 @@ psym_lookup_global_symbol_language (struct objfile *objfile, const char *name, lookup_name_info lookup_name (name, symbol_name_match_type::FULL); - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + for (partial_symtab *ps : require_partial_symbols (objfile)) { struct partial_symbol *psym; - if (ps->readin_p ()) + if (ps->readin_p (objfile)) continue; psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain); @@ -557,7 +472,7 @@ psymbol_name_matches (partial_symbol *psym, { const language_defn *lang = language_def (psym->ginfo.language ()); symbol_name_matcher_ftype *name_match - = get_symbol_name_matcher (lang, lookup_name); + = lang->get_symbol_name_matcher (lookup_name); return name_match (psym->ginfo.search_name (), lookup_name, NULL); } @@ -577,25 +492,27 @@ match_partial_symbol (struct objfile *objfile, { struct partial_symbol **start, **psym; struct partial_symbol **top, **real_top, **bottom, **center; - int length = (global ? pst->n_global_syms : pst->n_static_syms); + int length = (global + ? pst->global_psymbols.size () + : pst->static_psymbols.size ()); int do_linear_search = 1; if (length == 0) return NULL; start = (global ? - &objfile->partial_symtabs->global_psymbols[pst->globals_offset] : - &objfile->partial_symtabs->static_psymbols[pst->statics_offset]); + &pst->global_psymbols[0] : + &pst->static_psymbols[0]); if (global && ordered_compare) /* Can use a binary search. */ { do_linear_search = 0; /* Binary search. This search is guaranteed to end with center - pointing at the earliest partial symbol whose name might be - correct. At that point *all* partial symbols with an - appropriate name will be checked against the correct - domain. */ + pointing at the earliest partial symbol whose name might be + correct. At that point *all* partial symbols with an + appropriate name will be checked against the correct + domain. */ bottom = start; top = start + length - 1; @@ -655,25 +572,27 @@ lookup_partial_symbol (struct objfile *objfile, { struct partial_symbol **start, **psym; struct partial_symbol **top, **real_top, **bottom, **center; - int length = (global ? pst->n_global_syms : pst->n_static_syms); + int length = (global + ? pst->global_psymbols.size () + : pst->static_psymbols.size ()); int do_linear_search = 1; if (length == 0) return NULL; start = (global ? - &objfile->partial_symtabs->global_psymbols[pst->globals_offset] : - &objfile->partial_symtabs->static_psymbols[pst->statics_offset]); + &pst->global_psymbols[0] : + &pst->static_psymbols[0]); if (global) /* This means we can use a binary search. */ { do_linear_search = 0; /* Binary search. This search is guaranteed to end with center - pointing at the earliest partial symbol whose name might be - correct. At that point *all* partial symbols with an - appropriate name will be checked against the correct - domain. */ + pointing at the earliest partial symbol whose name might be + correct. At that point *all* partial symbols with an + appropriate name will be checked against the correct + domain. */ bottom = start; top = start + length - 1; @@ -748,11 +667,11 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) pst = pst->user; /* If it's been looked up before, return it. */ - if (pst->get_compunit_symtab ()) - return pst->get_compunit_symtab (); + if (pst->get_compunit_symtab (objfile)) + return pst->get_compunit_symtab (objfile); /* If it has not yet been read in, read it. */ - if (!pst->readin_p ()) + if (!pst->readin_p (objfile)) { scoped_restore decrementer = increment_reading_symtab (); @@ -766,18 +685,18 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) pst->read_symtab (objfile); } - return pst->get_compunit_symtab (); + return pst->get_compunit_symtab (objfile); } /* Psymtab version of find_last_source_symtab. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static struct symtab * -psym_find_last_source_symtab (struct objfile *ofp) +struct symtab * +psymbol_functions::find_last_source_symtab (struct objfile *ofp) { struct partial_symtab *cs_pst = NULL; - for (partial_symtab *ps : require_partial_symbols (ofp, true)) + for (partial_symtab *ps : require_partial_symbols (ofp)) { const char *name = ps->filename; int len = strlen (name); @@ -789,7 +708,7 @@ psym_find_last_source_symtab (struct objfile *ofp) if (cs_pst) { - if (cs_pst->readin_p ()) + if (cs_pst->readin_p (ofp)) { internal_error (__FILE__, __LINE__, _("select_source_symtab: " @@ -810,10 +729,10 @@ psym_find_last_source_symtab (struct objfile *ofp) /* Psymtab version of forget_cached_source_info. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_forget_cached_source_info (struct objfile *objfile) +void +psymbol_functions::forget_cached_source_info (struct objfile *objfile) { - for (partial_symtab *pst : require_partial_symbols (objfile, true)) + for (partial_symtab *pst : require_partial_symbols (objfile)) { if (pst->fullname != NULL) { @@ -825,21 +744,21 @@ psym_forget_cached_source_info (struct objfile *objfile) static void print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, - struct partial_symbol **p, int count, const char *what, - struct ui_file *outfile) + const std::vector &symbols, + const char *what, struct ui_file *outfile) { fprintf_filtered (outfile, " %s partial symbols:\n", what); - while (count-- > 0) + for (partial_symbol *p : symbols) { QUIT; - fprintf_filtered (outfile, " `%s'", (*p)->ginfo.linkage_name ()); - if ((*p)->ginfo.demangled_name () != NULL) + fprintf_filtered (outfile, " `%s'", p->ginfo.linkage_name ()); + if (p->ginfo.demangled_name () != NULL) { fprintf_filtered (outfile, " `%s'", - (*p)->ginfo.demangled_name ()); + p->ginfo.demangled_name ()); } fputs_filtered (", ", outfile); - switch ((*p)->domain) + switch (p->domain) { case UNDEF_DOMAIN: fputs_filtered ("undefined domain, ", outfile); @@ -863,7 +782,7 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, fputs_filtered (", ", outfile); break; } - switch ((*p)->aclass) + switch (p->aclass) { case LOC_UNDEF: fputs_filtered ("undefined", outfile); @@ -915,9 +834,8 @@ print_partial_symbols (struct gdbarch *gdbarch, struct objfile *objfile, break; } fputs_filtered (", ", outfile); - fputs_filtered (paddress (gdbarch, (*p)->unrelocated_address ()), outfile); + fputs_filtered (paddress (gdbarch, p->unrelocated_address ()), outfile); fprintf_filtered (outfile, "\n"); - p++; } } @@ -946,11 +864,11 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, gdb_print_host_address (objfile, outfile); fprintf_filtered (outfile, ")\n"); - if (psymtab->readin_p ()) + if (psymtab->readin_p (objfile)) { fprintf_filtered (outfile, " Full symtab was read (at "); - gdb_print_host_address (psymtab->get_compunit_symtab (), outfile); + gdb_print_host_address (psymtab->get_compunit_symtab (objfile), outfile); fprintf_filtered (outfile, ")\n"); } @@ -976,52 +894,81 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, gdb_print_host_address (psymtab->user, outfile); fprintf_filtered (outfile, "\n"); } - if (psymtab->n_global_syms > 0) + if (!psymtab->global_psymbols.empty ()) { print_partial_symbols - (gdbarch, objfile, - &objfile->partial_symtabs->global_psymbols[psymtab->globals_offset], - psymtab->n_global_syms, "Global", outfile); + (gdbarch, objfile, psymtab->global_psymbols, + "Global", outfile); } - if (psymtab->n_static_syms > 0) + if (!psymtab->static_psymbols.empty ()) { print_partial_symbols - (gdbarch, objfile, - &objfile->partial_symtabs->static_psymbols[psymtab->statics_offset], - psymtab->n_static_syms, "Static", outfile); + (gdbarch, objfile, psymtab->static_psymbols, + "Static", outfile); } fprintf_filtered (outfile, "\n"); } +/* Count the number of partial symbols in OBJFILE. */ + +int +psymbol_functions::count_psyms () +{ + int count = 0; + for (partial_symtab *pst : m_partial_symtabs->range ()) + { + count += pst->global_psymbols.size (); + count += pst->static_psymbols.size (); + } + return count; +} + /* Psymtab version of print_stats. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_print_stats (struct objfile *objfile) +void +psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache) { int i; - i = 0; - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + if (!print_bcache) { - if (!ps->readin_p ()) - i++; + int n_psyms = count_psyms (); + if (n_psyms > 0) + printf_filtered (_(" Number of \"partial\" symbols read: %d\n"), + n_psyms); + + i = 0; + for (partial_symtab *ps : require_partial_symbols (objfile)) + { + if (!ps->readin_p (objfile)) + i++; + } + printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), + i); + printf_filtered (_(" Total memory used for psymbol cache: %d\n"), + m_partial_symtabs->psymbol_cache.memory_used ()); + } + else + { + printf_filtered (_("Psymbol byte cache statistics:\n")); + m_partial_symtabs->psymbol_cache.print_statistics + ("partial symbol cache"); } - printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i); } /* Psymtab version of dump. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_dump (struct objfile *objfile) +void +psymbol_functions::dump (struct objfile *objfile) { struct partial_symtab *psymtab; - if (objfile->partial_symtabs->psymtabs) + if (m_partial_symtabs->psymtabs) { printf_filtered ("Psymtabs:\n"); - for (psymtab = objfile->partial_symtabs->psymtabs; + for (psymtab = m_partial_symtabs->psymtabs; psymtab != NULL; psymtab = psymtab->next) { @@ -1038,16 +985,16 @@ psym_dump (struct objfile *objfile) /* Psymtab version of expand_symtabs_for_function. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_expand_symtabs_for_function (struct objfile *objfile, - const char *func_name) +void +psymbol_functions::expand_symtabs_for_function (struct objfile *objfile, + const char *func_name) { lookup_name_info base_lookup (func_name, symbol_name_match_type::FULL); lookup_name_info lookup_name = base_lookup.make_ignore_params (); - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + for (partial_symtab *ps : require_partial_symbols (objfile)) { - if (ps->readin_p ()) + if (ps->readin_p (objfile)) continue; if ((lookup_partial_symbol (objfile, ps, lookup_name, 1, VAR_DOMAIN) @@ -1061,21 +1008,21 @@ psym_expand_symtabs_for_function (struct objfile *objfile, /* Psymtab version of expand_all_symtabs. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_expand_all_symtabs (struct objfile *objfile) +void +psymbol_functions::expand_all_symtabs (struct objfile *objfile) { - for (partial_symtab *psymtab : require_partial_symbols (objfile, true)) + for (partial_symtab *psymtab : require_partial_symbols (objfile)) psymtab_to_symtab (objfile, psymtab); } /* Psymtab version of expand_symtabs_with_fullname. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_expand_symtabs_with_fullname (struct objfile *objfile, - const char *fullname) +void +psymbol_functions::expand_symtabs_with_fullname (struct objfile *objfile, + const char *fullname) { - for (partial_symtab *p : require_partial_symbols (objfile, true)) + for (partial_symtab *p : require_partial_symbols (objfile)) { /* Anonymous psymtabs don't have a name of a source file. */ if (p->anonymous) @@ -1093,16 +1040,17 @@ psym_expand_symtabs_with_fullname (struct objfile *objfile, /* Psymtab version of map_symbol_filenames. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_map_symbol_filenames (struct objfile *objfile, - symbol_filename_ftype *fun, void *data, - int need_fullname) +void +psymbol_functions::map_symbol_filenames + (struct objfile *objfile, + gdb::function_view fun, + bool need_fullname) { - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + for (partial_symtab *ps : require_partial_symbols (objfile)) { const char *fullname; - if (ps->readin_p ()) + if (ps->readin_p (objfile)) continue; /* We can skip shared psymtabs here, because any file name will be @@ -1119,7 +1067,7 @@ psym_map_symbol_filenames (struct objfile *objfile, fullname = psymtab_to_fullname (ps); else fullname = NULL; - (*fun) (ps->filename, fullname, data); + fun (ps->filename, fullname); } } @@ -1169,8 +1117,8 @@ psymtab_to_fullname (struct partial_symtab *ps) /* Psymtab version of map_matching_symbols. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_map_matching_symbols +void +psymbol_functions::map_matching_symbols (struct objfile *objfile, const lookup_name_info &name, domain_enum domain, int global, @@ -1179,10 +1127,10 @@ psym_map_matching_symbols { const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK; - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + for (partial_symtab *ps : require_partial_symbols (objfile)) { QUIT; - if (ps->readin_p () + if (ps->readin_p (objfile) || match_partial_symbol (objfile, ps, global, name, domain, ordered_compare)) { @@ -1208,7 +1156,9 @@ static bool recursively_search_psymtabs (struct partial_symtab *ps, struct objfile *objfile, - enum search_domain domain, + block_search_flags search_flags, + domain_enum domain, + enum search_domain search, const lookup_name_info &lookup_name, gdb::function_view sym_matcher) { @@ -1230,8 +1180,8 @@ recursively_search_psymtabs continue; r = recursively_search_psymtabs (ps->dependencies[i], - objfile, domain, lookup_name, - sym_matcher); + objfile, search_flags, domain, search, + lookup_name, sym_matcher); if (r != 0) { ps->searched_flag = PST_SEARCHED_AND_FOUND; @@ -1239,26 +1189,35 @@ recursively_search_psymtabs } } - partial_symbol **gbound - = (objfile->partial_symtabs->global_psymbols.data () - + ps->globals_offset + ps->n_global_syms); - partial_symbol **sbound - = (objfile->partial_symtabs->static_psymbols.data () - + ps->statics_offset + ps->n_static_syms); + partial_symbol **gbound = (ps->global_psymbols.data () + + ps->global_psymbols.size ()); + partial_symbol **sbound = (ps->static_psymbols.data () + + ps->static_psymbols.size ()); partial_symbol **bound = gbound; /* Go through all of the symbols stored in a partial symtab in one loop. */ - partial_symbol **psym = (objfile->partial_symtabs->global_psymbols.data () - + ps->globals_offset); + partial_symbol **psym = ps->global_psymbols.data (); + + if ((search_flags & SEARCH_GLOBAL_BLOCK) == 0) + { + if (ps->static_psymbols.empty ()) + keep_going = 0; + else + { + psym = ps->static_psymbols.data (); + bound = sbound; + } + } + while (keep_going) { if (psym >= bound) { - if (bound == gbound && ps->n_static_syms != 0) + if (bound == gbound && !ps->static_psymbols.empty () + && (search_flags & SEARCH_STATIC_BLOCK) != 0) { - psym = (objfile->partial_symtabs->static_psymbols.data () - + ps->statics_offset); + psym = ps->static_psymbols.data (); bound = sbound; } else @@ -1269,16 +1228,19 @@ recursively_search_psymtabs { QUIT; - if ((domain == ALL_DOMAIN - || (domain == MODULES_DOMAIN - && (*psym)->domain == MODULE_DOMAIN) - || (domain == VARIABLES_DOMAIN - && (*psym)->aclass != LOC_TYPEDEF - && (*psym)->aclass != LOC_BLOCK) - || (domain == FUNCTIONS_DOMAIN - && (*psym)->aclass == LOC_BLOCK) - || (domain == TYPES_DOMAIN - && (*psym)->aclass == LOC_TYPEDEF)) + if ((domain == UNDEF_DOMAIN + || symbol_matches_domain ((*psym)->ginfo.language (), + (*psym)->domain, domain)) + && (search == ALL_DOMAIN + || (search == MODULES_DOMAIN + && (*psym)->domain == MODULE_DOMAIN) + || (search == VARIABLES_DOMAIN + && (*psym)->aclass != LOC_TYPEDEF + && (*psym)->aclass != LOC_BLOCK) + || (search == FUNCTIONS_DOMAIN + && (*psym)->aclass == LOC_BLOCK) + || (search == TYPES_DOMAIN + && (*psym)->aclass == LOC_TYPEDEF)) && psymbol_name_matches (*psym, lookup_name) && (sym_matcher == NULL || sym_matcher ((*psym)->ginfo.search_name ()))) @@ -1298,29 +1260,30 @@ recursively_search_psymtabs /* Psymtab version of expand_symtabs_matching. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static void -psym_expand_symtabs_matching +bool +psymbol_functions::expand_symtabs_matching (struct objfile *objfile, gdb::function_view file_matcher, const lookup_name_info *lookup_name, gdb::function_view symbol_matcher, gdb::function_view expansion_notify, - enum search_domain domain) + block_search_flags search_flags, + domain_enum domain, + enum search_domain search) { /* Clear the search flags. */ - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + for (partial_symtab *ps : require_partial_symbols (objfile)) ps->searched_flag = PST_NOT_SEARCHED; - for (partial_symtab *ps : objfile->psymtabs ()) + gdb::optional psym_lookup_name; + if (lookup_name != nullptr) + psym_lookup_name = lookup_name->make_ignore_params (); + + for (partial_symtab *ps : m_partial_symtabs->range ()) { QUIT; - if (ps->readin_p ()) - continue; - - /* We skip shared psymtabs because file-matching doesn't apply - to them; but we search them later in the loop. */ - if (ps->user != NULL) + if (ps->readin_p (objfile)) continue; if (file_matcher) @@ -1344,50 +1307,51 @@ psym_expand_symtabs_matching } if ((symbol_matcher == NULL && lookup_name == NULL) - || recursively_search_psymtabs (ps, objfile, domain, - lookup_name->make_ignore_params (), + || recursively_search_psymtabs (ps, objfile, search_flags, + domain, search, + *psym_lookup_name, symbol_matcher)) { struct compunit_symtab *symtab = psymtab_to_symtab (objfile, ps); if (expansion_notify != NULL) - expansion_notify (symtab); + if (!expansion_notify (symtab)) + return false; } } + + return true; } /* Psymtab version of has_symbols. See its definition in the definition of quick_symbol_functions in symfile.h. */ -static int -psym_has_symbols (struct objfile *objfile) +bool +psymbol_functions::has_symbols (struct objfile *objfile) { - return objfile->partial_symtabs->psymtabs != NULL; + return m_partial_symtabs->psymtabs != NULL; } /* Helper function for psym_find_compunit_symtab_by_address that fills - in psymbol_map for a given range of psymbols. */ + in m_psymbol_map for a given range of psymbols. */ -static void -psym_fill_psymbol_map (struct objfile *objfile, - struct partial_symtab *psymtab, - std::set *seen_addrs, - const std::vector &symbols, - int start, - int length) +void +psymbol_functions::fill_psymbol_map + (struct objfile *objfile, + struct partial_symtab *psymtab, + std::set *seen_addrs, + const std::vector &symbols) { - for (int i = 0; i < length; ++i) + for (partial_symbol *psym : symbols) { - struct partial_symbol *psym = symbols[start + i]; - if (psym->aclass == LOC_STATIC) { CORE_ADDR addr = psym->address (objfile); if (seen_addrs->find (addr) == seen_addrs->end ()) { seen_addrs->insert (addr); - objfile->psymbol_map.emplace_back (addr, psymtab); + m_psymbol_map.emplace_back (addr, psymtab); } } } @@ -1396,31 +1360,27 @@ psym_fill_psymbol_map (struct objfile *objfile, /* See find_compunit_symtab_by_address in quick_symbol_functions, in symfile.h. */ -static compunit_symtab * -psym_find_compunit_symtab_by_address (struct objfile *objfile, - CORE_ADDR address) +compunit_symtab * +psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile, + CORE_ADDR address) { - if (objfile->psymbol_map.empty ()) + if (m_psymbol_map.empty ()) { std::set seen_addrs; - for (partial_symtab *pst : require_partial_symbols (objfile, true)) + for (partial_symtab *pst : require_partial_symbols (objfile)) { - psym_fill_psymbol_map (objfile, pst, - &seen_addrs, - objfile->partial_symtabs->global_psymbols, - pst->globals_offset, - pst->n_global_syms); - psym_fill_psymbol_map (objfile, pst, - &seen_addrs, - objfile->partial_symtabs->static_psymbols, - pst->statics_offset, - pst->n_static_syms); + fill_psymbol_map (objfile, pst, + &seen_addrs, + pst->global_psymbols); + fill_psymbol_map (objfile, pst, + &seen_addrs, + pst->static_psymbols); } - objfile->psymbol_map.shrink_to_fit (); + m_psymbol_map.shrink_to_fit (); - std::sort (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), + std::sort (m_psymbol_map.begin (), m_psymbol_map.end (), [] (const std::pair &a, const std::pair &b) { @@ -1429,121 +1389,56 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile, } auto iter = std::lower_bound - (objfile->psymbol_map.begin (), objfile->psymbol_map.end (), address, + (m_psymbol_map.begin (), m_psymbol_map.end (), address, [] (const std::pair &a, CORE_ADDR b) { return a.first < b; }); - if (iter == objfile->psymbol_map.end () || iter->first != address) + if (iter == m_psymbol_map.end () || iter->first != address) return NULL; return psymtab_to_symtab (objfile, iter->second); } -const struct quick_symbol_functions psym_functions = -{ - psym_has_symbols, - psym_find_last_source_symtab, - psym_forget_cached_source_info, - psym_map_symtabs_matching_filename, - psym_lookup_symbol, - psym_lookup_global_symbol_language, - psym_print_stats, - psym_dump, - psym_expand_symtabs_for_function, - psym_expand_all_symtabs, - psym_expand_symtabs_with_fullname, - psym_map_matching_symbols, - psym_expand_symtabs_matching, - psym_find_pc_sect_compunit_symtab, - psym_find_compunit_symtab_by_address, - psym_map_symbol_filenames -}; - -static void -sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst) -{ - /* Sort the global list; don't sort the static list. */ - auto begin = objfile->partial_symtabs->global_psymbols.begin (); - std::advance (begin, pst->globals_offset); - - /* The psymbols for this partial_symtab are currently at the end of the - vector. */ - auto end = objfile->partial_symtabs->global_psymbols.end (); - - std::sort (begin, end, [] (partial_symbol *s1, partial_symbol *s2) - { - return strcmp_iw_ordered (s1->ginfo.search_name (), - s2->ginfo.search_name ()) < 0; - }); -} - /* Partially fill a partial symtab. It will be completely filled at the end of the symbol list. */ partial_symtab::partial_symtab (const char *filename, - struct objfile *objfile, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR textlow) - : partial_symtab (filename, objfile) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd) { set_text_low (textlow); set_text_high (raw_text_low ()); /* default */ - - auto *v1 = new std::vector; - objfile->partial_symtabs->current_global_psymbols.push_back (v1); - auto *v2 = new std::vector; - objfile->partial_symtabs->current_static_psymbols.push_back (v2); -} - -/* Concat vectors V1 and V2. */ - -static void -concat (std::vector *v1, std::vector *v2) -{ - v1->insert (v1->end (), v2->begin (), v2->end ()); - v2->clear (); } /* Perform "finishing up" operations of a partial symtab. */ void -end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst) +partial_symtab::end () { - pst->globals_offset = objfile->partial_symtabs->global_psymbols.size (); - pst->statics_offset = objfile->partial_symtabs->static_psymbols.size (); + global_psymbols.shrink_to_fit (); + static_psymbols.shrink_to_fit (); - auto *current_global_psymbols - = objfile->partial_symtabs->current_global_psymbols.back (); - auto *current_static_psymbols - = objfile->partial_symtabs->current_static_psymbols.back (); - objfile->partial_symtabs->current_global_psymbols.pop_back (); - objfile->partial_symtabs->current_static_psymbols.pop_back (); - - pst->n_global_syms - = current_global_psymbols->size (); - pst->n_static_syms - = current_static_psymbols->size (); - - concat (&objfile->partial_symtabs->global_psymbols, current_global_psymbols); - concat (&objfile->partial_symtabs->static_psymbols, current_static_psymbols); - - delete current_global_psymbols; - delete current_static_psymbols; - - sort_pst_symbols (objfile, pst); + /* Sort the global list; don't sort the static list. */ + std::sort (global_psymbols.begin (), + global_psymbols.end (), + [] (partial_symbol *s1, partial_symbol *s2) + { + return strcmp_iw_ordered (s1->ginfo.search_name (), + s2->ginfo.search_name ()) < 0; + }); } -/* Calculate a hash code for the given partial symbol. The hash is - calculated using the symbol's value, language, domain, class - and name. These are the values which are set by - add_psymbol_to_bcache. */ +/* See psymtab.h. */ -static unsigned long -psymbol_hash (const void *addr, int length) +unsigned long +psymbol_bcache::hash (const void *addr, int length) { unsigned long h = 0; struct partial_symbol *psymbol = (struct partial_symbol *) addr; @@ -1562,147 +1457,106 @@ psymbol_hash (const void *addr, int length) return h; } -/* Returns true if the symbol at addr1 equals the symbol at addr2. - For the comparison this function uses a symbols value, - language, domain, class and name. */ +/* See psymtab.h. */ -static int -psymbol_compare (const void *addr1, const void *addr2, int length) +int +psymbol_bcache::compare (const void *addr1, const void *addr2, int length) { struct partial_symbol *sym1 = (struct partial_symbol *) addr1; struct partial_symbol *sym2 = (struct partial_symbol *) addr2; return (memcmp (&sym1->ginfo.value, &sym2->ginfo.value, - sizeof (sym1->ginfo.value)) == 0 + sizeof (sym1->ginfo.value)) == 0 && sym1->ginfo.language () == sym2->ginfo.language () - && sym1->domain == sym2->domain - && sym1->aclass == sym2->aclass + && sym1->domain == sym2->domain + && sym1->aclass == sym2->aclass /* Note that psymbol names are interned via compute_and_set_names, so there's no need to compare the contents of the name here. */ - && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ()); -} - -/* Helper function, initialises partial symbol structure and stashes - it into objfile's bcache. Note that our caching mechanism will - use all fields of struct partial_symbol to determine hash value of the - structure. In other words, having two symbols with the same name but - different domain (or address) is possible and correct. */ - -static struct partial_symbol * -add_psymbol_to_bcache (const partial_symbol &psymbol, - struct objfile *objfile, - int *added) -{ - /* Stash the partial symbol away in the cache. */ - return ((struct partial_symbol *) - objfile->partial_symtabs->psymbol_cache.insert - (&psymbol, sizeof (struct partial_symbol), added)); -} - -/* Helper function, adds partial symbol to the given partial symbol list. */ - -static void -append_psymbol_to_list (std::vector *list, - struct partial_symbol *psym, - struct objfile *objfile) -{ - list->push_back (psym); - OBJSTAT (objfile, n_psyms++); + && sym1->ginfo.linkage_name () == sym2->ginfo.linkage_name ()); } /* See psympriv.h. */ void -add_psymbol_to_list (const partial_symbol &psymbol, - psymbol_placement where, - struct objfile *objfile) +partial_symtab::add_psymbol (const partial_symbol &psymbol, + psymbol_placement where, + psymtab_storage *partial_symtabs, + struct objfile *objfile) { - struct partial_symbol *psym; - - int added; + bool added; /* Stash the partial symbol away in the cache. */ - psym = add_psymbol_to_bcache (psymbol, objfile, &added); + partial_symbol *psym + = ((struct partial_symbol *) + partial_symtabs->psymbol_cache.insert + (&psymbol, sizeof (struct partial_symbol), &added)); /* Do not duplicate global partial symbols. */ if (where == psymbol_placement::GLOBAL && !added) return; /* Save pointer to partial symbol in psymtab, growing symtab if needed. */ - std::vector *list + std::vector &list = (where == psymbol_placement::STATIC - ? objfile->partial_symtabs->current_static_psymbols.back () - : objfile->partial_symtabs->current_global_psymbols.back ()); - append_psymbol_to_list (list, psym, objfile); + ? static_psymbols + : global_psymbols); + list.push_back (psym); } /* See psympriv.h. */ void -add_psymbol_to_list (gdb::string_view name, bool copy_name, - domain_enum domain, - enum address_class theclass, - short section, - psymbol_placement where, - CORE_ADDR coreaddr, - enum language language, struct objfile *objfile) +partial_symtab::add_psymbol (gdb::string_view name, bool copy_name, + domain_enum domain, + enum address_class theclass, + short section, + psymbol_placement where, + CORE_ADDR coreaddr, + enum language language, + psymtab_storage *partial_symtabs, + struct objfile *objfile) { struct partial_symbol psymbol; memset (&psymbol, 0, sizeof (psymbol)); psymbol.set_unrelocated_address (coreaddr); - psymbol.ginfo.section = section; + psymbol.ginfo.set_section_index (section); psymbol.domain = domain; psymbol.aclass = theclass; - psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ()); + psymbol.ginfo.set_language (language, partial_symtabs->obstack ()); psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd); - add_psymbol_to_list (psymbol, where, objfile); + add_psymbol (psymbol, where, partial_symtabs, objfile); } /* See psympriv.h. */ -void -init_psymbol_list (struct objfile *objfile, int total_symbols) -{ - if (objfile->partial_symtabs->global_psymbols.capacity () == 0 - && objfile->partial_symtabs->static_psymbols.capacity () == 0) - { - /* Current best guess is that approximately a twentieth of the - total symbols (in a debugging file) are global or static - oriented symbols, then multiply that by slop factor of - two. */ - objfile->partial_symtabs->global_psymbols.reserve (total_symbols / 10); - objfile->partial_symtabs->static_psymbols.reserve (total_symbols / 10); - } -} - -/* See psympriv.h. */ - -partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile) +partial_symtab::partial_symtab (const char *filename_, + psymtab_storage *partial_symtabs, + objfile_per_bfd_storage *objfile_per_bfd) : searched_flag (PST_NOT_SEARCHED), text_low_valid (0), text_high_valid (0) { - objfile->partial_symtabs->install_psymtab (this); + partial_symtabs->install_psymtab (this); - filename = objfile->intern (filename_); + filename = objfile_per_bfd->intern (filename_); if (symtab_create_debug) { /* Be a bit clever with debugging messages, and don't print objfile every time, only when it changes. */ - static char *last_objfile_name = NULL; + static std::string last_bfd_name; + const char *this_bfd_name + = bfd_get_filename (objfile_per_bfd->get_bfd ()); - if (last_objfile_name == NULL - || strcmp (last_objfile_name, objfile_name (objfile)) != 0) + if (last_bfd_name.empty () || last_bfd_name != this_bfd_name) { - xfree (last_objfile_name); - last_objfile_name = xstrdup (objfile_name (objfile)); + last_bfd_name = this_bfd_name; fprintf_filtered (gdb_stdlog, - "Creating one or more psymtabs for objfile %s ...\n", - last_objfile_name); + "Creating one or more psymtabs for %s ...\n", + this_bfd_name); } fprintf_filtered (gdb_stdlog, "Created psymtab %s for module %s.\n", @@ -1717,7 +1571,7 @@ partial_symtab::expand_dependencies (struct objfile *objfile) { for (int i = 0; i < number_of_dependencies; ++i) { - if (!dependencies[i]->readin_p () + if (!dependencies[i]->readin_p (objfile) && dependencies[i]->user == NULL) { /* Inform about additional files to be read in. */ @@ -1814,14 +1668,16 @@ dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj) of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */ static void -dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab, +dump_psymtab_addrmap (struct objfile *objfile, + psymtab_storage *partial_symtabs, + struct partial_symtab *psymtab, struct ui_file *outfile) { struct dump_psymtab_addrmap_data addrmap_dump_data; if ((psymtab == NULL || psymtab->psymtabs_addrmap_supported) - && objfile->partial_symtabs->psymtabs_addrmap != NULL) + && partial_symtabs->psymtabs_addrmap != NULL) { addrmap_dump_data.objfile = objfile; addrmap_dump_data.psymtab = psymtab; @@ -1829,7 +1685,7 @@ dump_psymtab_addrmap (struct objfile *objfile, struct partial_symtab *psymtab, addrmap_dump_data.previous_matched = 0; fprintf_filtered (outfile, "%sddress map:\n", psymtab == NULL ? "Entire a" : " A"); - addrmap_foreach (objfile->partial_symtabs->psymtabs_addrmap, + addrmap_foreach (partial_symtabs->psymtabs_addrmap, dump_psymtab_addrmap_1, &addrmap_dump_data); } } @@ -1920,42 +1776,25 @@ maintenance_print_psymbols (const char *args, int from_tty) if (!print_for_objfile) continue; - if (address_arg != NULL) + for (const auto &iter : objfile->qf) { - struct bound_minimal_symbol msymbol = { NULL, NULL }; + psymbol_functions *psf + = dynamic_cast (iter.get ()); + if (psf == nullptr) + continue; - /* We don't assume each pc has a unique objfile (this is for - debugging). */ - struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, - section, msymbol); - if (ps != NULL) - { - if (!printed_objfile_header) - { - outfile->printf ("\nPartial symtabs for objfile %s\n", - objfile_name (objfile)); - printed_objfile_header = 1; - } - dump_psymtab (objfile, ps, outfile); - dump_psymtab_addrmap (objfile, ps, outfile); - found = 1; - } - } - else - { - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + psymtab_storage *partial_symtabs + = psf->get_partial_symtabs ().get (); + + if (address_arg != NULL) { - int print_for_source = 0; + struct bound_minimal_symbol msymbol = { NULL, NULL }; - QUIT; - if (source_arg != NULL) - { - print_for_source - = compare_filenames_for_search (ps->filename, source_arg); - found = 1; - } - if (source_arg == NULL - || print_for_source) + /* We don't assume each pc has a unique objfile (this is for + debugging). */ + struct partial_symtab *ps + = psf->find_pc_sect_psymtab (objfile, pc, section, msymbol); + if (ps != NULL) { if (!printed_objfile_header) { @@ -1964,19 +1803,48 @@ maintenance_print_psymbols (const char *args, int from_tty) printed_objfile_header = 1; } dump_psymtab (objfile, ps, outfile); - dump_psymtab_addrmap (objfile, ps, outfile); + dump_psymtab_addrmap (objfile, partial_symtabs, ps, outfile); + found = 1; } } - } + else + { + for (partial_symtab *ps : psf->require_partial_symbols (objfile)) + { + int print_for_source = 0; - /* If we're printing all the objfile's symbols dump the full addrmap. */ + QUIT; + if (source_arg != NULL) + { + print_for_source + = compare_filenames_for_search (ps->filename, source_arg); + found = 1; + } + if (source_arg == NULL + || print_for_source) + { + if (!printed_objfile_header) + { + outfile->printf ("\nPartial symtabs for objfile %s\n", + objfile_name (objfile)); + printed_objfile_header = 1; + } + dump_psymtab (objfile, ps, outfile); + dump_psymtab_addrmap (objfile, partial_symtabs, ps, + outfile); + } + } + } - if (address_arg == NULL - && source_arg == NULL - && objfile->partial_symtabs->psymtabs_addrmap != NULL) - { - outfile->puts ("\n"); - dump_psymtab_addrmap (objfile, NULL, outfile); + /* If we're printing all the objfile's symbols dump the full addrmap. */ + + if (address_arg == NULL + && source_arg == NULL + && partial_symtabs->psymtabs_addrmap != NULL) + { + outfile->puts ("\n"); + dump_psymtab_addrmap (objfile, partial_symtabs, NULL, outfile); + } } } @@ -1994,12 +1862,10 @@ maintenance_print_psymbols (const char *args, int from_tty) static void maintenance_info_psymtabs (const char *regexp, int from_tty) { - struct program_space *pspace; - if (regexp) re_comp (regexp); - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) for (objfile *objfile : pspace->objfiles ()) { struct gdbarch *gdbarch = objfile->arch (); @@ -2008,97 +1874,94 @@ maintenance_info_psymtabs (const char *regexp, int from_tty) actually find a symtab whose name matches. */ int printed_objfile_start = 0; - for (partial_symtab *psymtab : require_partial_symbols (objfile, true)) + for (const auto &iter : objfile->qf) { - QUIT; - - if (! regexp - || re_exec (psymtab->filename)) + psymbol_functions *psf + = dynamic_cast (iter.get ()); + if (psf == nullptr) + continue; + for (partial_symtab *psymtab : psf->require_partial_symbols (objfile)) { - if (! printed_objfile_start) - { - printf_filtered ("{ objfile %s ", objfile_name (objfile)); - wrap_here (" "); - printf_filtered ("((struct objfile *) %s)\n", - host_address_to_string (objfile)); - printed_objfile_start = 1; - } - - printf_filtered (" { psymtab %s ", psymtab->filename); - wrap_here (" "); - printf_filtered ("((struct partial_symtab *) %s)\n", - host_address_to_string (psymtab)); - - printf_filtered (" readin %s\n", - psymtab->readin_p () ? "yes" : "no"); - printf_filtered (" fullname %s\n", - psymtab->fullname - ? psymtab->fullname : "(null)"); - printf_filtered (" text addresses "); - fputs_filtered (paddress (gdbarch, - psymtab->text_low (objfile)), - gdb_stdout); - printf_filtered (" -- "); - fputs_filtered (paddress (gdbarch, - psymtab->text_high (objfile)), - gdb_stdout); - printf_filtered ("\n"); - printf_filtered (" psymtabs_addrmap_supported %s\n", - (psymtab->psymtabs_addrmap_supported - ? "yes" : "no")); - printf_filtered (" globals "); - if (psymtab->n_global_syms) - { - auto p = &(objfile->partial_symtabs - ->global_psymbols[psymtab->globals_offset]); + QUIT; - printf_filtered - ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (p), - psymtab->n_global_syms); - } - else - printf_filtered ("(none)\n"); - printf_filtered (" statics "); - if (psymtab->n_static_syms) + if (! regexp + || re_exec (psymtab->filename)) { - auto p = &(objfile->partial_symtabs - ->static_psymbols[psymtab->statics_offset]); - - printf_filtered - ("(* (struct partial_symbol **) %s @ %d)\n", - host_address_to_string (p), - psymtab->n_static_syms); - } - else - printf_filtered ("(none)\n"); - if (psymtab->user) - printf_filtered (" user %s " - "((struct partial_symtab *) %s)\n", - psymtab->user->filename, - host_address_to_string (psymtab->user)); - printf_filtered (" dependencies "); - if (psymtab->number_of_dependencies) - { - int i; + if (! printed_objfile_start) + { + printf_filtered ("{ objfile %s ", objfile_name (objfile)); + wrap_here (" "); + printf_filtered ("((struct objfile *) %s)\n", + host_address_to_string (objfile)); + printed_objfile_start = 1; + } - printf_filtered ("{\n"); - for (i = 0; i < psymtab->number_of_dependencies; i++) + printf_filtered (" { psymtab %s ", psymtab->filename); + wrap_here (" "); + printf_filtered ("((struct partial_symtab *) %s)\n", + host_address_to_string (psymtab)); + + printf_filtered (" readin %s\n", + psymtab->readin_p (objfile) ? "yes" : "no"); + printf_filtered (" fullname %s\n", + psymtab->fullname + ? psymtab->fullname : "(null)"); + printf_filtered (" text addresses "); + fputs_filtered (paddress (gdbarch, + psymtab->text_low (objfile)), + gdb_stdout); + printf_filtered (" -- "); + fputs_filtered (paddress (gdbarch, + psymtab->text_high (objfile)), + gdb_stdout); + printf_filtered ("\n"); + printf_filtered (" psymtabs_addrmap_supported %s\n", + (psymtab->psymtabs_addrmap_supported + ? "yes" : "no")); + printf_filtered (" globals "); + if (!psymtab->global_psymbols.empty ()) + printf_filtered + ("(* (struct partial_symbol **) %s @ %d)\n", + host_address_to_string (psymtab->global_psymbols.data ()), + (int) psymtab->global_psymbols.size ()); + else + printf_filtered ("(none)\n"); + printf_filtered (" statics "); + if (!psymtab->static_psymbols.empty ()) + printf_filtered + ("(* (struct partial_symbol **) %s @ %d)\n", + host_address_to_string (psymtab->static_psymbols.data ()), + (int) psymtab->static_psymbols.size ()); + else + printf_filtered ("(none)\n"); + if (psymtab->user) + printf_filtered (" user %s " + "((struct partial_symtab *) %s)\n", + psymtab->user->filename, + host_address_to_string (psymtab->user)); + printf_filtered (" dependencies "); + if (psymtab->number_of_dependencies) { - struct partial_symtab *dep = psymtab->dependencies[i]; - - /* Note the string concatenation there --- no - comma. */ - printf_filtered (" psymtab %s " - "((struct partial_symtab *) %s)\n", - dep->filename, - host_address_to_string (dep)); + int i; + + printf_filtered ("{\n"); + for (i = 0; i < psymtab->number_of_dependencies; i++) + { + struct partial_symtab *dep = psymtab->dependencies[i]; + + /* Note the string concatenation there --- no + comma. */ + printf_filtered (" psymtab %s " + "((struct partial_symtab *) %s)\n", + dep->filename, + host_address_to_string (dep)); + } + printf_filtered (" }\n"); } - printf_filtered (" }\n"); + else + printf_filtered ("(none)\n"); + printf_filtered (" }\n"); } - else - printf_filtered ("(none)\n"); - printf_filtered (" }\n"); } } @@ -2116,95 +1979,101 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) struct compunit_symtab *cust = NULL; const struct blockvector *bv; const struct block *b; - int i; for (objfile *objfile : current_program_space->objfiles ()) - for (partial_symtab *ps : require_partial_symbols (objfile, true)) - { - struct gdbarch *gdbarch = objfile->arch (); + { + for (const auto &iter : objfile->qf) + { + psymbol_functions *psf + = dynamic_cast (iter.get ()); + if (psf == nullptr) + continue; - /* We don't call psymtab_to_symtab here because that may cause symtab - expansion. When debugging a problem it helps if checkers leave - things unchanged. */ - cust = ps->get_compunit_symtab (); + for (partial_symtab *ps : psf->require_partial_symbols (objfile)) + { + struct gdbarch *gdbarch = objfile->arch (); - /* First do some checks that don't require the associated symtab. */ - if (ps->text_high (objfile) < ps->text_low (objfile)) - { - printf_filtered ("Psymtab "); - puts_filtered (ps->filename); - printf_filtered (" covers bad range "); - fputs_filtered (paddress (gdbarch, ps->text_low (objfile)), - gdb_stdout); - printf_filtered (" - "); - fputs_filtered (paddress (gdbarch, ps->text_high (objfile)), - gdb_stdout); - printf_filtered ("\n"); - continue; - } + /* We don't call psymtab_to_symtab here because that may cause symtab + expansion. When debugging a problem it helps if checkers leave + things unchanged. */ + cust = ps->get_compunit_symtab (objfile); - /* Now do checks requiring the associated symtab. */ - if (cust == NULL) - continue; - bv = COMPUNIT_BLOCKVECTOR (cust); - b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); - partial_symbol **psym - = &objfile->partial_symtabs->static_psymbols[ps->statics_offset]; - for (i = 0; i < ps->n_static_syms; psym++, i++) - { - /* Skip symbols for inlined functions without address. These may - or may not have a match in the full symtab. */ - if ((*psym)->aclass == LOC_BLOCK - && (*psym)->ginfo.value.address == 0) - continue; + /* First do some checks that don't require the associated symtab. */ + if (ps->text_high (objfile) < ps->text_low (objfile)) + { + printf_filtered ("Psymtab "); + puts_filtered (ps->filename); + printf_filtered (" covers bad range "); + fputs_filtered (paddress (gdbarch, ps->text_low (objfile)), + gdb_stdout); + printf_filtered (" - "); + fputs_filtered (paddress (gdbarch, ps->text_high (objfile)), + gdb_stdout); + printf_filtered ("\n"); + continue; + } - sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (), - symbol_name_match_type::SEARCH_NAME, - (*psym)->domain); - if (!sym) - { - printf_filtered ("Static symbol `"); - puts_filtered ((*psym)->ginfo.linkage_name ()); - printf_filtered ("' only found in "); - puts_filtered (ps->filename); - printf_filtered (" psymtab\n"); - } - } - b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset]; - for (i = 0; i < ps->n_global_syms; psym++, i++) - { - sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (), - symbol_name_match_type::SEARCH_NAME, - (*psym)->domain); - if (!sym) - { - printf_filtered ("Global symbol `"); - puts_filtered ((*psym)->ginfo.linkage_name ()); - printf_filtered ("' only found in "); - puts_filtered (ps->filename); - printf_filtered (" psymtab\n"); - } - } - if (ps->raw_text_high () != 0 - && (ps->text_low (objfile) < BLOCK_START (b) - || ps->text_high (objfile) > BLOCK_END (b))) - { - printf_filtered ("Psymtab "); - puts_filtered (ps->filename); - printf_filtered (" covers "); - fputs_filtered (paddress (gdbarch, ps->text_low (objfile)), - gdb_stdout); - printf_filtered (" - "); - fputs_filtered (paddress (gdbarch, ps->text_high (objfile)), - gdb_stdout); - printf_filtered (" but symtab covers only "); - fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout); - printf_filtered (" - "); - fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout); - printf_filtered ("\n"); - } - } + /* Now do checks requiring the associated symtab. */ + if (cust == NULL) + continue; + bv = COMPUNIT_BLOCKVECTOR (cust); + b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); + for (partial_symbol *psym : ps->static_psymbols) + { + /* Skip symbols for inlined functions without address. These may + or may not have a match in the full symtab. */ + if (psym->aclass == LOC_BLOCK + && psym->ginfo.value.address == 0) + continue; + + sym = block_lookup_symbol (b, psym->ginfo.search_name (), + symbol_name_match_type::SEARCH_NAME, + psym->domain); + if (!sym) + { + printf_filtered ("Static symbol `"); + puts_filtered (psym->ginfo.linkage_name ()); + printf_filtered ("' only found in "); + puts_filtered (ps->filename); + printf_filtered (" psymtab\n"); + } + } + b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); + for (partial_symbol *psym : ps->global_psymbols) + { + sym = block_lookup_symbol (b, psym->ginfo.search_name (), + symbol_name_match_type::SEARCH_NAME, + psym->domain); + if (!sym) + { + printf_filtered ("Global symbol `"); + puts_filtered (psym->ginfo.linkage_name ()); + printf_filtered ("' only found in "); + puts_filtered (ps->filename); + printf_filtered (" psymtab\n"); + } + } + if (ps->raw_text_high () != 0 + && (ps->text_low (objfile) < BLOCK_START (b) + || ps->text_high (objfile) > BLOCK_END (b))) + { + printf_filtered ("Psymtab "); + puts_filtered (ps->filename); + printf_filtered (" covers "); + fputs_filtered (paddress (gdbarch, ps->text_low (objfile)), + gdb_stdout); + printf_filtered (" - "); + fputs_filtered (paddress (gdbarch, ps->text_high (objfile)), + gdb_stdout); + printf_filtered (" but symtab covers only "); + fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout); + printf_filtered (" - "); + fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout); + printf_filtered ("\n"); + } + } + } + } } void _initialize_psymtab ();