From b22a7c6ab6173fe4fa1352e14d00a234bbf50346 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 24 Nov 2018 14:22:25 -0700 Subject: [PATCH] Remove ALL_OBJFILE_PSYMTABS This removes the ALL_OBJFILE_PSYMTABS macro, replacing its uses with ranged for loops. gdb/ChangeLog 2019-01-09 Tom Tromey * dbxread.c (dbx_end_psymtab): Use objfile_psymtabs. * mdebugread.c (parse_partial_symbols): Use objfile_psymtabs. * psymtab.c (ALL_OBJFILE_PSYMTABS_REQUIRED): Remove. (psym_map_symtabs_matching_filename, find_pc_sect_psymtab) (psym_lookup_symbol, psym_find_last_source_symtab) (psym_forget_cached_source_info, psym_print_stats) (psym_expand_symtabs_for_function, psym_expand_all_symtabs) (psym_expand_symtabs_with_fullname, psym_map_symbol_filenames) (psym_map_matching_symbols, psym_expand_symtabs_matching) (psym_find_compunit_symtab_by_address) (maintenance_print_psymbols, maintenance_info_psymtabs) (maintenance_check_psymtabs): Use ranged for. * psymtab.h (class objfile_psymtabs): New. (require_partial_symbols): Return objfile_psymtabs. * psympriv.h (ALL_OBJFILE_PSYMTABS): Remove. --- gdb/ChangeLog | 18 +++ gdb/dbxread.c | 6 +- gdb/mdebugread.c | 22 ++-- gdb/psympriv.h | 5 - gdb/psymtab.c | 278 ++++++++++++++++++++--------------------------- gdb/psymtab.h | 22 +++- 6 files changed, 168 insertions(+), 183 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7d1ad6cc3b..35c34d56912 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2019-01-09 Tom Tromey + + * dbxread.c (dbx_end_psymtab): Use objfile_psymtabs. + * mdebugread.c (parse_partial_symbols): Use objfile_psymtabs. + * psymtab.c (ALL_OBJFILE_PSYMTABS_REQUIRED): Remove. + (psym_map_symtabs_matching_filename, find_pc_sect_psymtab) + (psym_lookup_symbol, psym_find_last_source_symtab) + (psym_forget_cached_source_info, psym_print_stats) + (psym_expand_symtabs_for_function, psym_expand_all_symtabs) + (psym_expand_symtabs_with_fullname, psym_map_symbol_filenames) + (psym_map_matching_symbols, psym_expand_symtabs_matching) + (psym_find_compunit_symtab_by_address) + (maintenance_print_psymbols, maintenance_info_psymtabs) + (maintenance_check_psymtabs): Use ranged for. + * psymtab.h (class objfile_psymtabs): New. + (require_partial_symbols): Return objfile_psymtabs. + * psympriv.h (ALL_OBJFILE_PSYMTABS): Remove. + 2019-01-09 Tom Tromey * symfile.c (overlay_invalidate_all, find_pc_overlay) diff --git a/gdb/dbxread.c b/gdb/dbxread.c index f63d18a9e5a..e3a952022cc 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -2014,18 +2014,14 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst, pst->set_text_low (pst->raw_text_high ()); else { - struct partial_symtab *p1; - /* If we know our own starting text address, then walk through all other psymtabs for this objfile, and if any didn't know their ending text address, set it to our starting address. Take care to not set our own ending address to our starting address. */ - ALL_OBJFILE_PSYMTABS (objfile, p1) - { + for (partial_symtab *p1 : objfile_psymtabs (objfile)) if (!p1->text_high_valid && p1->text_low_valid && p1 != pst) p1->set_text_high (pst->raw_text_low ()); - } } /* End of kludge for patching Solaris textlow and texthigh. */ diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index bb7e0667831..0583ce2f3ac 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -3681,17 +3681,17 @@ parse_partial_symbols (minimal_symbol_reader &reader, && save_pst->text_low_valid && !(objfile->flags & OBJF_REORDERED)) { - ALL_OBJFILE_PSYMTABS (objfile, pst) - { - if (save_pst != pst - && save_pst->raw_text_low () >= pst->raw_text_low () - && save_pst->raw_text_low () < pst->raw_text_high () - && save_pst->raw_text_high () > pst->raw_text_high ()) - { - objfile->flags |= OBJF_REORDERED; - break; - } - } + for (partial_symtab *iter : objfile_psymtabs (objfile)) + { + if (save_pst != iter + && save_pst->raw_text_low () >= iter->raw_text_low () + && save_pst->raw_text_low () < iter->raw_text_high () + && save_pst->raw_text_high () > iter->raw_text_high ()) + { + objfile->flags |= OBJF_REORDERED; + break; + } + } } } diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 29332dd3cf9..e28adfed4ab 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -331,9 +331,4 @@ class psymtab_discarder struct partial_symtab *m_psymtab; }; -/* Traverse all psymtabs in one objfile. */ - -#define ALL_OBJFILE_PSYMTABS(objfile, p) \ - for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next) - #endif /* PSYMPRIV_H */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index cd1f5036f4b..d5bd5b1b2db 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -19,8 +19,8 @@ #include "defs.h" #include "symtab.h" -#include "psympriv.h" #include "objfiles.h" +#include "psympriv.h" #include "block.h" #include "filenames.h" #include "source.h" @@ -65,10 +65,9 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *, static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst); -/* Ensure that the partial symbols for OBJFILE have been loaded. This - function always returns its argument, as a convenience. */ +/* See psymtab.h. */ -struct objfile * +objfile_psymtabs require_partial_symbols (struct objfile *objfile, int verbose) { if ((objfile->flags & OBJF_PSYMTABS_READ) == 0) @@ -93,21 +92,9 @@ require_partial_symbols (struct objfile *objfile, int verbose) } } - return objfile; + return objfile_psymtabs (objfile); } -/* Traverse all psymtabs in one objfile, requiring that the psymtabs - be read in. */ - -#define ALL_OBJFILE_PSYMTABS_REQUIRED(objfile, p) \ - for ((p) = require_partial_symbols (objfile, 1)->psymtabs; \ - (p) != NULL; \ - (p) = (p)->next) - -/* We want to make sure this file always requires psymtabs. */ - -#undef ALL_OBJFILE_PSYMTABS - /* Helper function for psym_map_symtabs_matching_filename that expands the symtabs and calls the iterator. */ @@ -146,57 +133,56 @@ psym_map_symtabs_matching_filename const char *real_path, gdb::function_view callback) { - struct partial_symtab *pst; const char *name_basename = lbasename (name); - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) - { - /* We can skip shared psymtabs here, because any file name will be - attached to the unshared psymtab. */ - if (pst->user != NULL) - continue; - - /* Anonymous psymtabs don't have a file name. */ - if (pst->anonymous) - continue; + for (partial_symtab *pst : require_partial_symbols (objfile, 1)) + { + /* We can skip shared psymtabs here, because any file name will be + attached to the unshared psymtab. */ + if (pst->user != NULL) + continue; - if (compare_filenames_for_search (pst->filename, name)) - { - if (partial_map_expand_apply (objfile, name, real_path, - pst, callback)) - return true; + /* Anonymous psymtabs don't have a file name. */ + if (pst->anonymous) continue; - } - /* Before we invoke realpath, which can get expensive when many - files are involved, do a quick comparison of the basenames. */ - if (! basenames_may_differ - && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0) - continue; + if (compare_filenames_for_search (pst->filename, name)) + { + if (partial_map_expand_apply (objfile, name, real_path, + pst, callback)) + return true; + continue; + } - if (compare_filenames_for_search (psymtab_to_fullname (pst), name)) - { - if (partial_map_expand_apply (objfile, name, real_path, - pst, callback)) - return true; + /* Before we invoke realpath, which can get expensive when many + files are involved, do a quick comparison of the basenames. */ + if (! basenames_may_differ + && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0) continue; - } - /* If the user gave us an absolute path, try to find the file in - this symtab and use its absolute path. */ - if (real_path != NULL) - { - gdb_assert (IS_ABSOLUTE_PATH (real_path)); - gdb_assert (IS_ABSOLUTE_PATH (name)); - if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0) - { - if (partial_map_expand_apply (objfile, name, real_path, - pst, callback)) - return true; - continue; - } - } - } + if (compare_filenames_for_search (psymtab_to_fullname (pst), name)) + { + if (partial_map_expand_apply (objfile, name, real_path, + pst, callback)) + return true; + continue; + } + + /* If the user gave us an absolute path, try to find the file in + this symtab and use its absolute path. */ + if (real_path != NULL) + { + gdb_assert (IS_ABSOLUTE_PATH (real_path)); + gdb_assert (IS_ABSOLUTE_PATH (name)); + if (filename_cmp (psymtab_to_fullname (pst), real_path) == 0) + { + if (partial_map_expand_apply (objfile, name, real_path, + pst, callback)) + return true; + continue; + } + } + } return false; } @@ -289,7 +275,6 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, struct obj_section *section, struct bound_minimal_symbol msymbol) { - struct partial_symtab *pst; CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -298,8 +283,9 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, if (objfile->psymtabs_addrmap != NULL) { - pst = ((struct partial_symtab *) - addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr)); + struct partial_symtab *pst + = ((struct partial_symtab *) + addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr)); if (pst != NULL) { /* FIXME: addrmaps currently do not handle overlayed sections, @@ -341,7 +327,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. */ - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) + for (partial_symtab *pst : require_partial_symbols (objfile, 1)) if (!pst->psymtabs_addrmap_supported && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile)) { @@ -458,43 +444,42 @@ psym_lookup_symbol (struct objfile *objfile, int block_index, const char *name, const domain_enum domain) { - struct partial_symtab *ps; 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); - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) - { - if (!ps->readin && lookup_partial_symbol (objfile, ps, 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); - 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. */ - } - } + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) + { + if (!ps->readin && lookup_partial_symbol (objfile, ps, 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); + 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; } @@ -752,10 +737,9 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) static struct symtab * psym_find_last_source_symtab (struct objfile *ofp) { - struct partial_symtab *ps; struct partial_symtab *cs_pst = NULL; - ALL_OBJFILE_PSYMTABS_REQUIRED (ofp, ps) + for (partial_symtab *ps : require_partial_symbols (ofp, 1)) { const char *name = ps->filename; int len = strlen (name); @@ -791,9 +775,7 @@ psym_find_last_source_symtab (struct objfile *ofp) static void psym_forget_cached_source_info (struct objfile *objfile) { - struct partial_symtab *pst; - - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) + for (partial_symtab *pst : require_partial_symbols (objfile, 1)) { if (pst->fullname != NULL) { @@ -973,10 +955,9 @@ static void psym_print_stats (struct objfile *objfile) { int i; - struct partial_symtab *ps; i = 0; - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) { if (ps->readin == 0) i++; @@ -1016,19 +997,17 @@ static void psym_expand_symtabs_for_function (struct objfile *objfile, const char *func_name) { - struct partial_symtab *ps; - - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) - { - if (ps->readin) - continue; + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) + { + if (ps->readin) + continue; - if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN) - != NULL) - || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN) - != NULL)) - psymtab_to_symtab (objfile, ps); - } + if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN) + != NULL) + || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN) + != NULL)) + psymtab_to_symtab (objfile, ps); + } } /* Psymtab version of expand_all_symtabs. See its definition in @@ -1037,12 +1016,8 @@ psym_expand_symtabs_for_function (struct objfile *objfile, static void psym_expand_all_symtabs (struct objfile *objfile) { - struct partial_symtab *psymtab; - - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab) - { - psymtab_to_symtab (objfile, psymtab); - } + for (partial_symtab *psymtab : require_partial_symbols (objfile, 1)) + psymtab_to_symtab (objfile, psymtab); } /* Psymtab version of expand_symtabs_with_fullname. See its definition in @@ -1052,9 +1027,7 @@ static void psym_expand_symtabs_with_fullname (struct objfile *objfile, const char *fullname) { - struct partial_symtab *p; - - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p) + for (partial_symtab *p : require_partial_symbols (objfile, 1)) { /* Anonymous psymtabs don't have a name of a source file. */ if (p->anonymous) @@ -1077,9 +1050,7 @@ psym_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun, void *data, int need_fullname) { - struct partial_symtab *ps; - - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) { const char *fullname; @@ -1192,9 +1163,8 @@ psym_map_matching_symbols (struct objfile *objfile, symbol_compare_ftype *ordered_compare) { const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK; - struct partial_symtab *ps; - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) { QUIT; if (ps->readin @@ -1317,17 +1287,13 @@ psym_expand_symtabs_matching gdb::function_view expansion_notify, enum search_domain domain) { - struct partial_symtab *ps; - lookup_name_info lookup_name = lookup_name_in.make_ignore_params (); /* Clear the search flags. */ - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) - { - ps->searched_flag = PST_NOT_SEARCHED; - } + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) + ps->searched_flag = PST_NOT_SEARCHED; - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : objfile_psymtabs (objfile)) { QUIT; @@ -1416,23 +1382,21 @@ psym_find_compunit_symtab_by_address (struct objfile *objfile, { if (objfile->psymbol_map.empty ()) { - struct partial_symtab *pst; - std::set seen_addrs; - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) - { - psym_fill_psymbol_map (objfile, pst, - &seen_addrs, - objfile->global_psymbols, - pst->globals_offset, - pst->n_global_syms); - psym_fill_psymbol_map (objfile, pst, - &seen_addrs, - objfile->static_psymbols, - pst->statics_offset, - pst->n_static_syms); - } + for (partial_symtab *pst : require_partial_symbols (objfile, 1)) + { + psym_fill_psymbol_map (objfile, pst, + &seen_addrs, + objfile->global_psymbols, + pst->globals_offset, + pst->n_global_syms); + psym_fill_psymbol_map (objfile, pst, + &seen_addrs, + objfile->static_psymbols, + pst->statics_offset, + pst->n_static_syms); + } objfile->psymbol_map.shrink_to_fit (); @@ -1868,7 +1832,6 @@ maintenance_print_psymbols (const char *args, int from_tty) { struct ui_file *outfile = gdb_stdout; char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL; - struct partial_symtab *ps; int i, outfile_idx, found; CORE_ADDR pc = 0; struct obj_section *section = NULL; @@ -1956,7 +1919,8 @@ maintenance_print_psymbols (const char *args, int from_tty) /* We don't assume each pc has a unique objfile (this is for debugging). */ - ps = find_pc_sect_psymtab (objfile, pc, section, msymbol); + struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, + section, msymbol); if (ps != NULL) { if (!printed_objfile_header) @@ -1972,7 +1936,7 @@ maintenance_print_psymbols (const char *args, int from_tty) } else { - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) { int print_for_source = 0; @@ -2032,13 +1996,12 @@ maintenance_info_psymtabs (const char *regexp, int from_tty) for (objfile *objfile : all_objfiles (pspace)) { struct gdbarch *gdbarch = get_objfile_arch (objfile); - struct partial_symtab *psymtab; /* We don't want to print anything for this objfile until we actually find a symtab whose name matches. */ int printed_objfile_start = 0; - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, psymtab) + for (partial_symtab *psymtab : require_partial_symbols (objfile, 1)) { QUIT; @@ -2139,13 +2102,12 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) { struct symbol *sym; struct compunit_symtab *cust = NULL; - struct partial_symtab *ps; const struct blockvector *bv; struct block *b; int length; for (objfile *objfile : all_objfiles (current_program_space)) - ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) + for (partial_symtab *ps : require_partial_symbols (objfile, 1)) { struct gdbarch *gdbarch = get_objfile_arch (objfile); diff --git a/gdb/psymtab.h b/gdb/psymtab.h index ed400e91c0d..a1cab96238f 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -21,6 +21,7 @@ #define PSYMTAB_H #include "symfile.h" +#include "common/next-iterator.h" /* A bcache for partial symbols. */ @@ -35,12 +36,25 @@ extern const struct quick_symbol_functions psym_functions; extern const struct quick_symbol_functions dwarf2_gdb_index_functions; extern const struct quick_symbol_functions dwarf2_debug_names_functions; +/* A range adapter that makes it possible to iterate over all + psymtabs in one objfile. */ + +class objfile_psymtabs : public next_adapter +{ +public: + + explicit objfile_psymtabs (struct objfile *objfile) + : next_adapter (objfile->psymtabs) + { + } +}; + /* Ensure that the partial symbols for OBJFILE have been loaded. If VERBOSE is non-zero, then this will print a message when symbols - are loaded. This function always returns its argument, as a - convenience. */ + are loaded. This function returns a range adapter suitable for + iterating over the psymtabs of OBJFILE. */ -extern struct objfile *require_partial_symbols (struct objfile *objfile, - int verbose); +extern objfile_psymtabs require_partial_symbols (struct objfile *objfile, + int verbose); #endif /* PSYMTAB_H */ -- 2.30.2