X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpsymtab.c;h=5960c593fcfc24d4c3b904ecec269c62630dcf99;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=6a2f7f7202a07b2454e606f9fa6087c312f5f53f;hpb=891813beaab0029c88c9eeec9c1847d68a4d6050;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 6a2f7f7202..5960c593fc 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -39,7 +39,8 @@ static struct partial_symbol *lookup_partial_symbol (struct objfile *, struct partial_symtab *, - const char *, int, + const lookup_name_info &, + int, domain_enum); static const char *psymtab_to_fullname (struct partial_symtab *ps); @@ -131,7 +132,7 @@ partial_map_expand_apply (struct objfile *objfile, gdb_assert (pst->user == NULL); /* Don't visit already-expanded psymtabs. */ - if (pst->readin) + if (pst->readin_p (objfile)) return 0; /* This may expand more than one symtab, and we want to iterate over @@ -156,17 +157,15 @@ psym_map_symtabs_matching_filename for (partial_symtab *pst : require_partial_symbols (objfile, true)) { - /* 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; if (compare_filenames_for_search (pst->filename, name)) { + while (pst->user) + pst = pst->user; + if (partial_map_expand_apply (objfile, name, real_path, pst, callback)) return true; @@ -385,15 +384,15 @@ psym_find_pc_sect_compunit_symtab (struct objfile *objfile, msymbol); if (ps != NULL) { - if (warn_if_readin && ps->readin) + 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. */ warning (_("\ (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), - paddress (get_objfile_arch (objfile), pc)); + paddress (objfile->arch (), pc)); psymtab_to_symtab (objfile, ps); - return ps->compunit_symtab; + return ps->get_compunit_symtab (objfile); } return NULL; } @@ -482,10 +481,13 @@ psym_lookup_symbol (struct objfile *objfile, 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 && lookup_partial_symbol (objfile, ps, name, - psymtab_index, domain)) + if (!ps->readin_p (objfile) + && 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); @@ -517,6 +519,36 @@ psym_lookup_symbol (struct objfile *objfile, 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) +{ + *symbol_found_p = false; + if (objfile->sf == NULL) + return language_unknown; + + lookup_name_info lookup_name (name, symbol_name_match_type::FULL); + + for (partial_symtab *ps : require_partial_symbols (objfile, true)) + { + struct partial_symbol *psym; + if (ps->readin_p (objfile)) + continue; + + psym = lookup_partial_symbol (objfile, ps, lookup_name, 1, domain); + if (psym) + { + *symbol_found_p = true; + return psym->ginfo.language (); + } + } + + return language_unknown; +} + /* Returns true if PSYM matches LOOKUP_NAME. */ static bool @@ -574,8 +606,7 @@ match_partial_symbol (struct objfile *objfile, gdb_assert (center < top); enum language lang = (*center)->ginfo.language (); - const char *lang_ln - = name.language_lookup_name (lang).c_str (); + const char *lang_ln = name.language_lookup_name (lang); if (ordered_compare ((*center)->ginfo.search_name (), lang_ln) >= 0) @@ -612,42 +643,14 @@ match_partial_symbol (struct objfile *objfile, return NULL; } -/* Returns the name used to search psymtabs. Unlike symtabs, psymtabs do - not contain any method/function instance information (since this would - force reading type information while reading psymtabs). Therefore, - if NAME contains overload information, it must be stripped before searching - psymtabs. */ - -static gdb::unique_xmalloc_ptr -psymtab_search_name (const char *name) -{ - switch (current_language->la_language) - { - case language_cplus: - { - if (strchr (name, '(')) - { - gdb::unique_xmalloc_ptr ret = cp_remove_params (name); - - if (ret) - return ret; - } - } - break; - - default: - break; - } - - return make_unique_xstrdup (name); -} - -/* Look, in partial_symtab PST, for symbol whose natural name is NAME. - Check the global symbols if GLOBAL, the static symbols if not. */ +/* Look, in partial_symtab PST, for symbol whose natural name is + LOOKUP_NAME. Check the global symbols if GLOBAL, the static + symbols if not. */ static struct partial_symbol * lookup_partial_symbol (struct objfile *objfile, - struct partial_symtab *pst, const char *name, + struct partial_symtab *pst, + const lookup_name_info &lookup_name, int global, domain_enum domain) { struct partial_symbol **start, **psym; @@ -658,10 +661,6 @@ lookup_partial_symbol (struct objfile *objfile, if (length == 0) return NULL; - gdb::unique_xmalloc_ptr search_name = psymtab_search_name (name); - - lookup_name_info lookup_name (search_name.get (), symbol_name_match_type::FULL); - start = (global ? &objfile->partial_symtabs->global_psymbols[pst->globals_offset] : &objfile->partial_symtabs->static_psymbols[pst->statics_offset]); @@ -682,11 +681,11 @@ lookup_partial_symbol (struct objfile *objfile, while (top > bottom) { center = bottom + (top - bottom) / 2; - if (!(center < top)) - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); + + gdb_assert (center < top); + if (strcmp_iw_ordered ((*center)->ginfo.search_name (), - search_name.get ()) >= 0) + lookup_name.c_str ()) >= 0) { top = center; } @@ -695,9 +694,8 @@ lookup_partial_symbol (struct objfile *objfile, bottom = center + 1; } } - if (!(top == bottom)) - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); + + gdb_assert (top == bottom); /* For `case_sensitivity == case_sensitive_off' strcmp_iw_ordered will search more exactly than what matches SYMBOL_MATCHES_SEARCH_NAME. */ @@ -750,18 +748,25 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst) pst = pst->user; /* If it's been looked up before, return it. */ - if (pst->compunit_symtab) - return pst->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) + if (!pst->readin_p (objfile)) { scoped_restore decrementer = increment_reading_symtab (); + if (info_verbose) + { + printf_filtered (_("Reading in symbols for %s...\n"), + pst->filename); + gdb_flush (gdb_stdout); + } + pst->read_symtab (objfile); } - return pst->compunit_symtab; + return pst->get_compunit_symtab (objfile); } /* Psymtab version of find_last_source_symtab. See its definition in @@ -784,7 +789,7 @@ psym_find_last_source_symtab (struct objfile *ofp) if (cs_pst) { - if (cs_pst->readin) + if (cs_pst->readin_p (ofp)) { internal_error (__FILE__, __LINE__, _("select_source_symtab: " @@ -920,7 +925,7 @@ static void dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, struct ui_file *outfile) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); int i; if (psymtab->anonymous) @@ -941,11 +946,11 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, gdb_print_host_address (objfile, outfile); fprintf_filtered (outfile, ")\n"); - if (psymtab->readin) + if (psymtab->readin_p (objfile)) { fprintf_filtered (outfile, " Full symtab was read (at "); - gdb_print_host_address (psymtab->compunit_symtab, outfile); + gdb_print_host_address (psymtab->get_compunit_symtab (objfile), outfile); fprintf_filtered (outfile, ")\n"); } @@ -999,7 +1004,7 @@ psym_print_stats (struct objfile *objfile) i = 0; for (partial_symtab *ps : require_partial_symbols (objfile, true)) { - if (!ps->readin) + if (!ps->readin_p (objfile)) i++; } printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i); @@ -1037,14 +1042,17 @@ static void psym_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)) { - if (ps->readin) + if (ps->readin_p (objfile)) continue; - if ((lookup_partial_symbol (objfile, ps, func_name, 1, VAR_DOMAIN) + if ((lookup_partial_symbol (objfile, ps, lookup_name, 1, VAR_DOMAIN) != NULL) - || (lookup_partial_symbol (objfile, ps, func_name, 0, VAR_DOMAIN) + || (lookup_partial_symbol (objfile, ps, lookup_name, 0, VAR_DOMAIN) != NULL)) psymtab_to_symtab (objfile, ps); } @@ -1094,7 +1102,7 @@ psym_map_symbol_filenames (struct objfile *objfile, { const char *fullname; - if (ps->readin) + if (ps->readin_p (objfile)) continue; /* We can skip shared psymtabs here, because any file name will be @@ -1174,7 +1182,7 @@ psym_map_matching_symbols for (partial_symtab *ps : require_partial_symbols (objfile, true)) { QUIT; - if (ps->readin + if (ps->readin_p (objfile) || match_partial_symbol (objfile, ps, global, name, domain, ordered_compare)) { @@ -1294,13 +1302,11 @@ static void psym_expand_symtabs_matching (struct objfile *objfile, gdb::function_view file_matcher, - const lookup_name_info &lookup_name_in, + const lookup_name_info *lookup_name, gdb::function_view symbol_matcher, gdb::function_view expansion_notify, enum search_domain domain) { - lookup_name_info lookup_name = lookup_name_in.make_ignore_params (); - /* Clear the search flags. */ for (partial_symtab *ps : require_partial_symbols (objfile, true)) ps->searched_flag = PST_NOT_SEARCHED; @@ -1309,7 +1315,7 @@ psym_expand_symtabs_matching { QUIT; - if (ps->readin) + if (ps->readin_p (objfile)) continue; /* We skip shared psymtabs because file-matching doesn't apply @@ -1337,8 +1343,10 @@ psym_expand_symtabs_matching continue; } - if (recursively_search_psymtabs (ps, objfile, domain, - lookup_name, symbol_matcher)) + if ((symbol_matcher == NULL && lookup_name == NULL) + || recursively_search_psymtabs (ps, objfile, domain, + lookup_name->make_ignore_params (), + symbol_matcher)) { struct compunit_symtab *symtab = psymtab_to_symtab (objfile, ps); @@ -1441,6 +1449,7 @@ const struct quick_symbol_functions psym_functions = 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, @@ -1483,8 +1492,20 @@ partial_symtab::partial_symtab (const char *filename, { set_text_low (textlow); set_text_high (raw_text_low ()); /* default */ - globals_offset = objfile->partial_symtabs->global_psymbols.size (); - statics_offset = objfile->partial_symtabs->static_psymbols.size (); + + 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. */ @@ -1492,10 +1513,26 @@ partial_symtab::partial_symtab (const char *filename, void end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst) { - pst->n_global_syms = (objfile->partial_symtabs->global_psymbols.size () - - pst->globals_offset); - pst->n_static_syms = (objfile->partial_symtabs->static_psymbols.size () - - pst->statics_offset); + pst->globals_offset = objfile->partial_symtabs->global_psymbols.size (); + pst->statics_offset = objfile->partial_symtabs->static_psymbols.size (); + + 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); } @@ -1553,24 +1590,10 @@ psymbol_compare (const void *addr1, const void *addr2, int length) different domain (or address) is possible and correct. */ static struct partial_symbol * -add_psymbol_to_bcache (gdb::string_view name, bool copy_name, - domain_enum domain, - enum address_class theclass, - short section, - CORE_ADDR coreaddr, - enum language language, struct objfile *objfile, +add_psymbol_to_bcache (const partial_symbol &psymbol, + struct objfile *objfile, int *added) { - struct partial_symbol psymbol; - memset (&psymbol, 0, sizeof (psymbol)); - - psymbol.set_unrelocated_address (coreaddr); - psymbol.ginfo.section = section; - psymbol.domain = domain; - psymbol.aclass = theclass; - psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ()); - psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd); - /* Stash the partial symbol away in the cache. */ return ((struct partial_symbol *) objfile->partial_symtabs->psymbol_cache.insert @@ -1591,21 +1614,16 @@ append_psymbol_to_list (std::vector *list, /* See psympriv.h. */ void -add_psymbol_to_list (gdb::string_view name, bool copy_name, - domain_enum domain, - enum address_class theclass, - short section, +add_psymbol_to_list (const partial_symbol &psymbol, psymbol_placement where, - CORE_ADDR coreaddr, - enum language language, struct objfile *objfile) + struct objfile *objfile) { struct partial_symbol *psym; int added; /* Stash the partial symbol away in the cache. */ - psym = add_psymbol_to_bcache (name, copy_name, domain, theclass, - section, coreaddr, language, objfile, &added); + psym = add_psymbol_to_bcache (psymbol, objfile, &added); /* Do not duplicate global partial symbols. */ if (where == psymbol_placement::GLOBAL && !added) @@ -1614,13 +1632,37 @@ add_psymbol_to_list (gdb::string_view name, bool copy_name, /* Save pointer to partial symbol in psymtab, growing symtab if needed. */ std::vector *list = (where == psymbol_placement::STATIC - ? &objfile->partial_symtabs->static_psymbols - : &objfile->partial_symtabs->global_psymbols); + ? objfile->partial_symtabs->current_static_psymbols.back () + : objfile->partial_symtabs->current_global_psymbols.back ()); append_psymbol_to_list (list, psym, objfile); } /* 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) +{ + struct partial_symbol psymbol; + memset (&psymbol, 0, sizeof (psymbol)); + + psymbol.set_unrelocated_address (coreaddr); + psymbol.ginfo.section = section; + psymbol.domain = domain; + psymbol.aclass = theclass; + psymbol.ginfo.set_language (language, objfile->partial_symtabs->obstack ()); + psymbol.ginfo.compute_and_set_names (name, copy_name, objfile->per_bfd); + + add_psymbol_to_list (psymbol, where, objfile); +} + +/* See psympriv.h. */ + void init_psymbol_list (struct objfile *objfile, int total_symbols) { @@ -1645,10 +1687,7 @@ partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile) { objfile->partial_symtabs->install_psymtab (this); - filename - = ((const char *) objfile->per_bfd->filename_cache.insert - (filename_, strlen (filename_) + 1)); - compunit_symtab = NULL; + filename = objfile->intern (filename_); if (symtab_create_debug) { @@ -1671,6 +1710,33 @@ partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile) } } +/* See psympriv.h. */ + +void +partial_symtab::expand_dependencies (struct objfile *objfile) +{ + for (int i = 0; i < number_of_dependencies; ++i) + { + if (!dependencies[i]->readin_p (objfile) + && dependencies[i]->user == NULL) + { + /* Inform about additional files to be read in. */ + if (info_verbose) + { + fputs_filtered (" ", gdb_stdout); + wrap_here (""); + fputs_filtered ("and ", gdb_stdout); + wrap_here (""); + printf_filtered ("%s...", dependencies[i]->filename); + wrap_here (""); /* Flush output */ + gdb_flush (gdb_stdout); + } + dependencies[i]->expand_psymtab (objfile); + } + } +} + + void psymtab_storage::discard_psymtab (struct partial_symtab *pst) { @@ -1716,7 +1782,7 @@ dump_psymtab_addrmap_1 (void *datap, CORE_ADDR start_addr, void *obj) { struct dump_psymtab_addrmap_data *data = (struct dump_psymtab_addrmap_data *) datap; - struct gdbarch *gdbarch = get_objfile_arch (data->objfile); + struct gdbarch *gdbarch = data->objfile->arch (); struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj; const char *psymtab_address_or_end = NULL; @@ -1928,15 +1994,13 @@ 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 = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); /* We don't want to print anything for this objfile until we actually find a symtab whose name matches. */ @@ -1964,7 +2028,7 @@ maintenance_info_psymtabs (const char *regexp, int from_tty) host_address_to_string (psymtab)); printf_filtered (" readin %s\n", - psymtab->readin ? "yes" : "no"); + psymtab->readin_p (objfile) ? "yes" : "no"); printf_filtered (" fullname %s\n", psymtab->fullname ? psymtab->fullname : "(null)"); @@ -2006,6 +2070,11 @@ maintenance_info_psymtabs (const char *regexp, int from_tty) } 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) { @@ -2045,17 +2114,17 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) struct compunit_symtab *cust = NULL; const struct blockvector *bv; const struct block *b; - int length; + int i; for (objfile *objfile : current_program_space->objfiles ()) for (partial_symtab *ps : require_partial_symbols (objfile, true)) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); /* 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->compunit_symtab; + cust = ps->get_compunit_symtab (objfile); /* First do some checks that don't require the associated symtab. */ if (ps->text_high (objfile) < ps->text_low (objfile)) @@ -2079,9 +2148,14 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); partial_symbol **psym = &objfile->partial_symtabs->static_psymbols[ps->statics_offset]; - length = ps->n_static_syms; - while (length--) + 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; + sym = block_lookup_symbol (b, (*psym)->ginfo.search_name (), symbol_name_match_type::SEARCH_NAME, (*psym)->domain); @@ -2093,12 +2167,10 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) puts_filtered (ps->filename); printf_filtered (" psymtab\n"); } - psym++; } b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); psym = &objfile->partial_symtabs->global_psymbols[ps->globals_offset]; - length = ps->n_global_syms; - while (length--) + 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, @@ -2111,7 +2183,6 @@ maintenance_check_psymtabs (const char *ignore, int from_tty) puts_filtered (ps->filename); printf_filtered (" psymtab\n"); } - psym++; } if (ps->raw_text_high () != 0 && (ps->text_low (objfile) < BLOCK_START (b)