X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Flinespec.c;h=ddca05b3dbf6d0419a2676fc147da5cce65c593e;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=8e2ade07c73adcb7dbe063f65cf6355efe8d0f40;hpb=9bb9b2f9d6d5aa90f579494d8407375a87a9ad0b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linespec.c b/gdb/linespec.c index 8e2ade07c7..ddca05b3db 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1,6 +1,6 @@ /* Parser for linespec for the GNU debugger, GDB. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -44,8 +44,8 @@ #include "ada-lang.h" #include "stack.h" #include "location.h" -#include "common/function-view.h" -#include "common/def-vector.h" +#include "gdbsupport/function-view.h" +#include "gdbsupport/def-vector.h" #include /* An enumeration of the various things a user might attempt to @@ -555,7 +555,7 @@ copy_token_string (linespec_token token) const char *str, *s; if (token.type == LSTOKEN_KEYWORD) - return gdb::unique_xmalloc_ptr (xstrdup (LS_TOKEN_KEYWORD (token))); + return make_unique_xstrdup (LS_TOKEN_KEYWORD (token)); str = LS_TOKEN_STOKEN (token).ptr; s = remove_trailing_whitespace (str, str + LS_TOKEN_STOKEN (token).length); @@ -760,7 +760,9 @@ linespec_lexer_lex_string (linespec_parser *parser) /* Do not tokenize ABI tags such as "[abi:cxx11]". */ else if (PARSER_STREAM (parser) - start > 4 && startswith (PARSER_STREAM (parser) - 4, "[abi")) - ++(PARSER_STREAM (parser)); + { + /* Nothing. */ + } /* Do not tokenify if the input length so far is one (i.e, a single-letter drive name) and the next character @@ -861,6 +863,7 @@ linespec_lexer_lex_string (linespec_parser *parser) } /* Advance the stream. */ + gdb_assert (*(PARSER_STREAM (parser)) != '\0'); ++(PARSER_STREAM (parser)); } } @@ -1130,58 +1133,56 @@ iterate_over_all_matching_symtabs struct program_space *search_pspace, bool include_inline, gdb::function_view callback) { - struct program_space *pspace; - - ALL_PSPACES (pspace) - { - if (search_pspace != NULL && search_pspace != pspace) - continue; - if (pspace->executing_startup) - continue; + for (struct program_space *pspace : program_spaces) + { + if (search_pspace != NULL && search_pspace != pspace) + continue; + if (pspace->executing_startup) + continue; - set_current_program_space (pspace); + set_current_program_space (pspace); - for (objfile *objfile : current_program_space->objfiles ()) - { - if (objfile->sf) - objfile->sf->qf->expand_symtabs_matching (objfile, - NULL, - lookup_name, - NULL, NULL, - search_domain); - - for (compunit_symtab *cu : objfile->compunits ()) - { - struct symtab *symtab = COMPUNIT_FILETABS (cu); + for (objfile *objfile : current_program_space->objfiles ()) + { + if (objfile->sf) + objfile->sf->qf->expand_symtabs_matching (objfile, + NULL, + &lookup_name, + NULL, NULL, + search_domain); + + for (compunit_symtab *cu : objfile->compunits ()) + { + struct symtab *symtab = COMPUNIT_FILETABS (cu); - iterate_over_file_blocks (symtab, lookup_name, name_domain, - callback); + iterate_over_file_blocks (symtab, lookup_name, name_domain, + callback); - if (include_inline) - { - struct block *block; - int i; + if (include_inline) + { + const struct block *block; + int i; - for (i = FIRST_LOCAL_BLOCK; - i < BLOCKVECTOR_NBLOCKS (SYMTAB_BLOCKVECTOR (symtab)); - i++) - { - block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), i); - state->language->la_iterate_over_symbols - (block, lookup_name, name_domain, - [&] (block_symbol *bsym) - { - /* Restrict calls to CALLBACK to symbols - representing inline symbols only. */ - if (SYMBOL_INLINED (bsym->symbol)) - return callback (bsym); - return true; - }); - } - } - } - } - } + for (i = FIRST_LOCAL_BLOCK; + i < BLOCKVECTOR_NBLOCKS (SYMTAB_BLOCKVECTOR (symtab)); + i++) + { + block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), i); + state->language->iterate_over_symbols + (block, lookup_name, name_domain, + [&] (block_symbol *bsym) + { + /* Restrict calls to CALLBACK to symbols + representing inline symbols only. */ + if (SYMBOL_INLINED (bsym->symbol)) + return callback (bsym); + return true; + }); + } + } + } + } + } } /* Returns the block to be used for symbol searches from @@ -1203,7 +1204,7 @@ iterate_over_file_blocks (struct symtab *symtab, const lookup_name_info &name, domain_enum domain, gdb::function_view callback) { - struct block *block; + const struct block *block; for (block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), STATIC_BLOCK); block != NULL; @@ -1221,7 +1222,7 @@ find_methods (struct type *t, enum language t_lang, const char *name, std::vector *superclasses) { int ibase; - const char *class_name = TYPE_NAME (t); + const char *class_name = t->name (); /* Ignore this class if it doesn't have a name. This is ugly, but unless we figure out how to get the physname without the name of @@ -1486,7 +1487,7 @@ decode_line_2 (struct linespec_state *self, std::vector *result, const char *select_mode) { - char *args; + const char *args; const char *prompt; int i; std::vector filters; @@ -2063,8 +2064,7 @@ canonicalize_linespec (struct linespec_state *state, const linespec_p ls) gdb_assert (!ls->labels.function_symbols->empty () && (ls->labels.function_symbols->size () == 1)); block_symbol s = ls->labels.function_symbols->front (); - explicit_loc->function_name - = xstrdup (SYMBOL_NATURAL_NAME (s.symbol)); + explicit_loc->function_name = xstrdup (s.symbol->natural_name ()); } } @@ -2192,7 +2192,7 @@ create_sals_line_offset (struct linespec_state *self, skip_prologue_sal (&intermediate_results[i]); intermediate_results[i].symbol = sym; add_sal_to_sals (self, &values, &intermediate_results[i], - sym ? SYMBOL_NATURAL_NAME (sym) : NULL, 0); + sym ? sym->natural_name () : NULL, 0); } } @@ -2247,7 +2247,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (symbol_to_sal (&sal, state->funfirstline, sym.symbol) && maybe_add_address (state->addr_set, pspace, sal.pc)) add_sal_to_sals (state, &sals, &sal, - SYMBOL_NATURAL_NAME (sym.symbol), 0); + sym.symbol->natural_name (), 0); } } else if (ls->function_symbols != NULL || ls->minimal_symbols != NULL) @@ -2289,7 +2289,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc) { struct gdbarch *gdbarch - = get_objfile_arch (elem.objfile); + = elem.objfile->arch (); msym_addr = (gdbarch_convert_from_func_ptr_addr (gdbarch, @@ -2312,7 +2312,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (symbol_to_sal (&sal, state->funfirstline, sym.symbol) && maybe_add_address (state->addr_set, pspace, sal.pc)) add_sal_to_sals (state, &sals, &sal, - SYMBOL_NATURAL_NAME (sym.symbol), 0); + sym.symbol->natural_name (), 0); } } } @@ -2383,16 +2383,15 @@ convert_explicit_location_to_linespec (struct linespec_state *self, if (source_filename != NULL) { - TRY + try { *result->file_symtabs = symtabs_from_filename (source_filename, self->search_pspace); } - CATCH (except, RETURN_MASK_ERROR) + catch (const gdb_exception_error &except) { source_file_not_found_error (source_filename); } - END_CATCH result->explicit_loc.source_filename = xstrdup (source_filename); } else @@ -2509,7 +2508,7 @@ parse_linespec (linespec_parser *parser, const char *arg, symbol_name_match_type match_type) { linespec_token token; - struct gdb_exception file_exception = exception_none; + struct gdb_exception file_exception; /* A special case to start. It has become quite popular for IDEs to work around bugs in the previous parser by quoting @@ -2608,17 +2607,16 @@ parse_linespec (linespec_parser *parser, const char *arg, gdb::unique_xmalloc_ptr user_filename = copy_token_string (token); /* Check if the input is a filename. */ - TRY + try { *PARSER_RESULT (parser)->file_symtabs = symtabs_from_filename (user_filename.get (), PARSER_STATE (parser)->search_pspace); } - CATCH (ex, RETURN_MASK_ERROR) + catch (gdb_exception_error &ex) { - file_exception = ex; + file_exception = std::move (ex); } - END_CATCH if (file_exception.reason >= 0) { @@ -2665,7 +2663,7 @@ parse_linespec (linespec_parser *parser, const char *arg, /* The linespec didn't parse. Re-throw the file exception if there was one. */ if (file_exception.reason < 0) - throw_exception (file_exception); + throw_exception (std::move (file_exception)); /* Otherwise, the symbol is not found. */ symbol_not_found_error (PARSER_EXPLICIT (parser)->function_name, @@ -2902,7 +2900,7 @@ complete_label (completion_tracker &tracker, { for (const auto &label : *labels) { - char *match = xstrdup (SYMBOL_SEARCH_NAME (label.symbol)); + char *match = xstrdup (label.symbol->search_name ()); tracker.add_completion (gdb::unique_xmalloc_ptr (match)); } delete labels; @@ -2923,7 +2921,7 @@ linespec_complete_label (completion_tracker &tracker, line_offset unknown_offset = { 0, LINE_OFFSET_UNKNOWN }; - TRY + try { convert_explicit_location_to_linespec (PARSER_STATE (&parser), PARSER_RESULT (&parser), @@ -2932,11 +2930,10 @@ linespec_complete_label (completion_tracker &tracker, func_name_match_type, NULL, unknown_offset); } - CATCH (ex, RETURN_MASK_ERROR) + catch (const gdb_exception_error &ex) { return; } - END_CATCH complete_label (tracker, &parser, label_name); } @@ -2959,14 +2956,13 @@ linespec_complete (completion_tracker &tracker, const char *text, /* Parse as much as possible. parser.completion_word will hold furthest completion point we managed to parse to. */ - TRY + try { parse_linespec (&parser, text, match_type); } - CATCH (except, RETURN_MASK_ERROR) + catch (const gdb_exception_error &except) { } - END_CATCH if (parser.completion_quote_char != '\0' && parser.completion_quote_end != NULL @@ -3148,17 +3144,16 @@ event_location_to_sals (linespec_parser *parser, case LINESPEC_LOCATION: { PARSER_STATE (parser)->is_linespec = 1; - TRY + try { const linespec_location *ls = get_linespec_location (location); result = parse_linespec (parser, ls->spec_string, ls->match_type); } - CATCH (except, RETURN_MASK_ERROR) + catch (const gdb_exception_error &except) { - throw_exception (except); + throw; } - END_CATCH } break; @@ -3323,8 +3318,7 @@ decode_line_with_last_displayed (const char *string, int flags) ? decode_line_1 (location.get (), flags, NULL, get_last_displayed_symtab (), get_last_displayed_line ()) - : decode_line_1 (location.get (), flags, NULL, - (struct symtab *) NULL, 0)); + : decode_line_1 (location.get (), flags, NULL, NULL, 0)); if (*string) error (_("Junk at end of line specification: %s"), string); @@ -3334,7 +3328,7 @@ decode_line_with_last_displayed (const char *string, int flags) -/* First, some functions to initialize stuff at the beggining of the +/* First, some functions to initialize stuff at the beginning of the function. */ static void @@ -3497,9 +3491,9 @@ decode_compound_collector::operator () (block_symbol *bsym) t = SYMBOL_TYPE (sym); t = check_typedef (t); - if (TYPE_CODE (t) != TYPE_CODE_STRUCT - && TYPE_CODE (t) != TYPE_CODE_UNION - && TYPE_CODE (t) != TYPE_CODE_NAMESPACE) + if (t->code () != TYPE_CODE_STRUCT + && t->code () != TYPE_CODE_UNION + && t->code () != TYPE_CODE_NAMESPACE) return true; /* Continue iterating. */ slot = htab_find_slot (m_unique_syms, sym, INSERT); @@ -3674,12 +3668,12 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, because we collect data across the program space before deciding what to do. */ last_result_len = 0; - unsigned int ix = 0; for (const auto &elt : *sym_classes) { struct type *t; struct program_space *pspace; struct symbol *sym = elt.symbol; + unsigned int ix = &elt - &*sym_classes->begin (); /* Program spaces that are executing startup should have been filtered out earlier. */ @@ -3687,7 +3681,7 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, gdb_assert (!pspace->executing_startup); set_current_program_space (pspace); t = check_typedef (SYMBOL_TYPE (sym)); - find_methods (t, SYMBOL_LANGUAGE (sym), + find_methods (t, sym->language (), method_name, &result_names, &superclass_vec); /* Handle all items from a single program space at once; and be @@ -3700,7 +3694,7 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, this program space, consider superclasses. */ if (result_names.size () == last_result_len) find_superclass_methods (std::move (superclass_vec), method_name, - SYMBOL_LANGUAGE (sym), &result_names); + sym->language (), &result_names); /* We have a list of candidate symbol names, so now we iterate over the symbol tables looking for all @@ -3710,7 +3704,6 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, superclass_vec.clear (); last_result_len = result_names.size (); - ++ix; } } @@ -3791,9 +3784,7 @@ collect_symtabs_from_filename (const char *file, /* Find that file's data. */ if (search_pspace == NULL) { - struct program_space *pspace; - - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) { if (pspace->executing_startup) continue; @@ -3903,9 +3894,10 @@ find_linespec_symbols (struct linespec_state *state, std::vector *symbols, std::vector *minsyms) { - std::string canon = cp_canonicalize_string_no_typedefs (lookup_name); - if (!canon.empty ()) - lookup_name = canon.c_str (); + gdb::unique_xmalloc_ptr canon + = cp_canonicalize_string_no_typedefs (lookup_name); + if (canon != nullptr) + lookup_name = canon.get (); /* It's important to not call expand_symtabs_matching unnecessarily as it can really slow things down (by unnecessarily expanding @@ -3959,7 +3951,7 @@ find_linespec_symbols (struct linespec_state *state, if (!classes.empty ()) { /* Now locate a list of suitable methods named METHOD. */ - TRY + try { find_method (state, file_symtabs, klass.c_str (), method.c_str (), @@ -3968,12 +3960,11 @@ find_linespec_symbols (struct linespec_state *state, /* If successful, we're done. If NOT_FOUND_ERROR was not thrown, rethrow the exception that we did get. */ - CATCH (except, RETURN_MASK_ERROR) + catch (const gdb_exception_error &except) { if (except.error != NOT_FOUND_ERROR) - throw_exception (except); + throw; } - END_CATCH } } } @@ -4003,9 +3994,9 @@ find_label_symbols_in_block (const struct block *block, ALL_BLOCK_SYMBOLS (block, iter, sym) { - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), + if (symbol_matches_domain (sym->language (), SYMBOL_DOMAIN (sym), LABEL_DOMAIN) - && cmp (SYMBOL_SEARCH_NAME (sym), name, name_len) == 0) + && cmp (sym->search_name (), name, name_len) == 0) { result->push_back ({sym, block}); label_funcs_ret->push_back ({fn_sym, block}); @@ -4105,7 +4096,7 @@ decode_digits_list_mode (struct linespec_state *self, val.symtab = elt; val.pspace = SYMTAB_PSPACE (elt); val.pc = 0; - val.explicit_line = 1; + val.explicit_line = true; add_sal_to_sals (self, &values, &val, NULL, 0); } @@ -4113,8 +4104,9 @@ decode_digits_list_mode (struct linespec_state *self, return values; } -/* A helper for create_sals_line_offset that iterates over the symtabs, - adding lines to the VEC. */ +/* A helper for create_sals_line_offset that iterates over the symtabs + associated with LS and returns a vector of corresponding symtab_and_line + structures. */ static std::vector decode_digits_ordinary (struct linespec_state *self, @@ -4139,6 +4131,7 @@ decode_digits_ordinary (struct linespec_state *self, sal.pspace = SYMTAB_PSPACE (elt); sal.symtab = elt; sal.line = line; + sal.explicit_line = true; sal.pc = pc; sals.push_back (std::move (sal)); } @@ -4171,7 +4164,7 @@ linespec_parse_variable (struct linespec_state *self, const char *variable) sscanf ((variable[1] == '$') ? variable + 2 : variable + 1, "%d", &index); val_history = access_value_history ((variable[1] == '$') ? -index : index); - if (TYPE_CODE (value_type (val_history)) != TYPE_CODE_INT) + if (value_type (val_history)->code () != TYPE_CODE_INT) error (_("History values used in line " "specs must have integer values.")); offset.offset = value_as_long (val_history); @@ -4223,7 +4216,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile, if (is_function) { - const char *msym_name = MSYMBOL_LINKAGE_NAME (msymbol); + const char *msym_name = msymbol->linkage_name (); if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc || MSYMBOL_TYPE (msymbol) == mst_data_gnu_ifunc) @@ -4252,7 +4245,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile, sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol); if (maybe_add_address (self->addr_set, objfile->pspace, sal.pc)) - add_sal_to_sals (self, result, &sal, MSYMBOL_NATURAL_NAME (msymbol), 0); + add_sal_to_sals (self, result, &sal, msymbol->natural_name (), 0); } /* A helper function to classify a minimal_symbol_type according to @@ -4338,29 +4331,27 @@ search_minsyms_for_name (struct collect_info *info, if (symtab == NULL) { - struct program_space *pspace; - - ALL_PSPACES (pspace) - { - if (search_pspace != NULL && search_pspace != pspace) - continue; - if (pspace->executing_startup) - continue; + for (struct program_space *pspace : program_spaces) + { + if (search_pspace != NULL && search_pspace != pspace) + continue; + if (pspace->executing_startup) + continue; - set_current_program_space (pspace); + set_current_program_space (pspace); - for (objfile *objfile : current_program_space->objfiles ()) - { - iterate_over_minimal_symbols (objfile, name, - [&] (struct minimal_symbol *msym) - { - add_minsym (msym, objfile, nullptr, - info->state->list_mode, - &minsyms); - return false; - }); - } - } + for (objfile *objfile : current_program_space->objfiles ()) + { + iterate_over_minimal_symbols (objfile, name, + [&] (struct minimal_symbol *msym) + { + add_minsym (msym, objfile, nullptr, + info->state->list_mode, + &minsyms); + return false; + }); + } + } } else {