X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flinespec.c;h=964697b7bcbd3f6be276bd500916f1bf06ed0cad;hb=592553c46959c98bf5981ad245d0fbb97f373d2a;hp=9c92444e16bf82da18ad82a0503a69791decdf9b;hpb=3553eadc8cb5f087ea0fb72ebdd1c52264304e0b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linespec.c b/gdb/linespec.c index 9c92444e16..964697b7bc 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1,6 +1,6 @@ /* Parser for linespec for the GNU debugger, GDB. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -77,13 +77,6 @@ enum class linespec_complete_what KEYWORD, }; -/* Typedef for unique_ptrs of vectors of symtabs. */ - -typedef std::unique_ptr> symtab_vector_up; - -typedef struct symbol *symbolp; -DEF_VEC_P (symbolp); - /* An address entry is used to ensure that any given location is only added to the result a single time. It holds an address and the program space from which the address came. */ @@ -94,10 +87,6 @@ struct address_entry CORE_ADDR addr; }; -typedef struct bound_minimal_symbol bound_minimal_symbol_d; - -DEF_VEC_O (bound_minimal_symbol_d); - /* A linespec. Elements of this structure are filled in by a parser (either parse_linespec or some other function). The structure is then converted into SALs by convert_linespec_to_sals. */ @@ -115,16 +104,16 @@ struct linespec /* A list of matching function symbols and minimal symbols. Both lists may be NULL (or empty) if no matching symbols were found. */ - std::vector *function_symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector *function_symbols; + std::vector *minimal_symbols; /* A structure of matching label symbols and the corresponding function symbol in which the label was found. Both may be NULL or both must be non-NULL. */ struct { - std::vector *label_symbols; - std::vector *function_symbols; + std::vector *label_symbols; + std::vector *function_symbols; } labels; }; typedef struct linespec *linespec_p; @@ -201,26 +190,41 @@ struct collect_info /* The result being accumulated. */ struct { - std::vector *symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector *symbols; + std::vector *minimal_symbols; } result; /* Possibly add a symbol to the results. */ - bool add_symbol (symbol *sym); + virtual bool add_symbol (block_symbol *bsym); }; bool -collect_info::add_symbol (symbol *sym) +collect_info::add_symbol (block_symbol *bsym) { /* In list mode, add all matching symbols, regardless of class. This allows the user to type "list a_global_variable". */ - if (SYMBOL_CLASS (sym) == LOC_BLOCK || this->state->list_mode) - this->result.symbols->push_back (sym); + if (SYMBOL_CLASS (bsym->symbol) == LOC_BLOCK || this->state->list_mode) + this->result.symbols->push_back (*bsym); /* Continue iterating. */ return true; } +/* Custom collect_info for symbol_searcher. */ + +struct symbol_searcher_collect_info + : collect_info +{ + bool add_symbol (block_symbol *bsym) override + { + /* Add everything. */ + this->result.symbols->push_back (*bsym); + + /* Continue iterating. */ + return true; + } +}; + /* Token types */ enum ls_token_type @@ -277,8 +281,18 @@ typedef struct ls_token linespec_token; /* An instance of the linespec parser. */ -struct ls_parser +struct linespec_parser { + linespec_parser (int flags, const struct language_defn *language, + struct program_space *search_pspace, + struct symtab *default_symtab, + int default_line, + struct linespec_result *canonical); + + ~linespec_parser (); + + DISABLE_COPY_AND_ASSIGN (linespec_parser); + /* Lexer internal data */ struct { @@ -291,43 +305,42 @@ struct ls_parser /* The current token. */ linespec_token current; - } lexer; + } lexer {}; /* Is the entire linespec quote-enclosed? */ - int is_quote_enclosed; + int is_quote_enclosed = 0; /* The state of the parse. */ - struct linespec_state state; + struct linespec_state state {}; #define PARSER_STATE(PPTR) (&(PPTR)->state) /* The result of the parse. */ - struct linespec result; + struct linespec result {}; #define PARSER_RESULT(PPTR) (&(PPTR)->result) /* What the parser believes the current word point should complete to. */ - linespec_complete_what complete_what; + linespec_complete_what complete_what = linespec_complete_what::NOTHING; /* The completion word point. The parser advances this as it skips tokens. At some point the input string will end or parsing will fail, and then we attempt completion at the captured completion word point, interpreting the string at completion_word as COMPLETE_WHAT. */ - const char *completion_word; + const char *completion_word = nullptr; /* If the current token was a quoted string, then this is the quoting character (either " or '). */ - int completion_quote_char; + int completion_quote_char = 0; /* If the current token was a quoted string, then this points at the end of the quoted string. */ - const char *completion_quote_end; + const char *completion_quote_end = nullptr; /* If parsing for completion, then this points at the completion tracker. Otherwise, this is NULL. */ - struct completion_tracker *completion_tracker; + struct completion_tracker *completion_tracker = nullptr; }; -typedef struct ls_parser linespec_parser; /* A convenience macro for accessing the explicit location result of the parser. */ @@ -349,20 +362,20 @@ static std::vector decode_objc (struct linespec_state *self, linespec_p ls, const char *arg); -static symtab_vector_up symtabs_from_filename +static std::vector symtabs_from_filename (const char *, struct program_space *pspace); -static std::vector *find_label_symbols - (struct linespec_state *self, std::vector *function_symbols, - std::vector *label_funcs_ret, const char *name, +static std::vector *find_label_symbols + (struct linespec_state *self, std::vector *function_symbols, + std::vector *label_funcs_ret, const char *name, bool completion_mode = false); static void find_linespec_symbols (struct linespec_state *self, std::vector *file_symtabs, const char *name, symbol_name_match_type name_match_type, - std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms); + std::vector *symbols, + std::vector *minsyms); static struct line_offset linespec_parse_variable (struct linespec_state *self, @@ -381,7 +394,7 @@ static void add_all_symbol_names_from_pspace (struct collect_info *info, struct program_space *pspace, const std::vector &names, enum search_domain search_domain); -static symtab_vector_up +static std::vector collect_symtabs_from_filename (const char *file, struct program_space *pspace); @@ -400,11 +413,10 @@ static void minsym_found (struct linespec_state *self, struct objfile *objfile, struct minimal_symbol *msymbol, std::vector *result); -static int compare_symbols (const void *a, const void *b); -static bool std_compare_symbols (const struct symbol *a, - const struct symbol *b); +static bool compare_symbols (const block_symbol &a, const block_symbol &b); -static int compare_msymbols (const void *a, const void *b); +static bool compare_msymbols (const bound_minimal_symbol &a, + const bound_minimal_symbol &b); /* Permitted quote characters for the parser. This is different from the completer's quote characters to allow backward compatibility with the @@ -786,16 +798,16 @@ linespec_lexer_lex_string (linespec_parser *parser) == language_cplus) && (PARSER_STREAM (parser) - start) >= CP_OPERATOR_LEN) { - const char *p = PARSER_STREAM (parser); + const char *op = PARSER_STREAM (parser); - while (p > start && isspace (p[-1])) - p--; - if (p - start >= CP_OPERATOR_LEN) + while (op > start && isspace (op[-1])) + op--; + if (op - start >= CP_OPERATOR_LEN) { - p -= CP_OPERATOR_LEN; - if (strncmp (p, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0 - && (p == start - || !(isalnum (p[-1]) || p[-1] == '_'))) + op -= CP_OPERATOR_LEN; + if (strncmp (op, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0 + && (op == start + || !(isalnum (op[-1]) || op[-1] == '_'))) { /* This is an operator name. Keep going. */ ++(PARSER_STREAM (parser)); @@ -806,15 +818,15 @@ linespec_lexer_lex_string (linespec_parser *parser) } } - const char *p = find_parameter_list_end (PARSER_STREAM (parser)); - PARSER_STREAM (parser) = p; + const char *end = find_parameter_list_end (PARSER_STREAM (parser)); + PARSER_STREAM (parser) = end; /* Don't loop around to the normal \0 case above because we don't want to misinterpret a potential keyword at the end of the token when the string isn't "()<>"-balanced. This handles "b function(thread" in completion mode. */ - if (*p == '\0') + if (*end == '\0') { LS_TOKEN_STOKEN (token).ptr = start; LS_TOKEN_STOKEN (token).length @@ -832,9 +844,9 @@ linespec_lexer_lex_string (linespec_parser *parser) == language_cplus) && (PARSER_STREAM (parser) - start) > CP_OPERATOR_LEN) { - const char *p = strstr (start, CP_OPERATOR_STR); + const char *op = strstr (start, CP_OPERATOR_STR); - if (p != NULL && is_operator_name (p)) + if (op != NULL && is_operator_name (op)) { /* This is an operator name. Keep going. */ ++(PARSER_STREAM (parser)); @@ -1118,7 +1130,6 @@ iterate_over_all_matching_symtabs struct program_space *search_pspace, bool include_inline, gdb::function_view callback) { - struct objfile *objfile; struct program_space *pspace; ALL_PSPACES (pspace) @@ -1130,46 +1141,46 @@ iterate_over_all_matching_symtabs set_current_program_space (pspace); - ALL_OBJFILES (objfile) - { - struct compunit_symtab *cu; - - if (objfile->sf) - objfile->sf->qf->expand_symtabs_matching (objfile, - NULL, - lookup_name, - NULL, NULL, - search_domain); - - ALL_OBJFILE_COMPUNITS (objfile, cu) - { - struct symtab *symtab = COMPUNIT_FILETABS (cu); + for (objfile *objfile : all_objfiles (current_program_space)) + { + if (objfile->sf) + objfile->sf->qf->expand_symtabs_matching (objfile, + NULL, + lookup_name, + NULL, NULL, + search_domain); + + for (compunit_symtab *cu : objfile_compunits (objfile)) + { + 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) + { + 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, [&] (symbol *sym) - { - /* Restrict calls to CALLBACK to symbols - representing inline symbols only. */ - if (SYMBOL_INLINED (sym)) - return callback (sym); - return true; - }); - } - } - } - } + 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; + }); + } + } + } + } } } @@ -1239,17 +1250,6 @@ find_methods (struct type *t, enum language t_lang, const char *name, --method_counter) { const char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter); - char dem_opname[64]; - - if (startswith (method_name, "__") || - startswith (method_name, "op") || - startswith (method_name, "type")) - { - if (cplus_demangle_opname (method_name, dem_opname, DMGL_ANSI)) - method_name = dem_opname; - else if (cplus_demangle_opname (method_name, dem_opname, 0)) - method_name = dem_opname; - } if (symbol_name_compare (method_name, lookup_name, NULL)) { @@ -1768,9 +1768,9 @@ linespec_parse_basic (linespec_parser *parser) { gdb::unique_xmalloc_ptr name; linespec_token token; - std::vector symbols; - std::vector *labels; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector symbols; + std::vector *labels; + std::vector minimal_symbols; /* Get the next token. */ token = linespec_lexer_lex_one (parser); @@ -1873,11 +1873,13 @@ linespec_parse_basic (linespec_parser *parser) PARSER_EXPLICIT (parser)->func_name_match_type, &symbols, &minimal_symbols); - if (!symbols.empty () || minimal_symbols != NULL) + if (!symbols.empty () || !minimal_symbols.empty ()) { PARSER_RESULT (parser)->function_symbols - = new std::vector (std::move (symbols)); - PARSER_RESULT (parser)->minimal_symbols = minimal_symbols; + = new std::vector (std::move (symbols)); + PARSER_RESULT (parser)->minimal_symbols + = new std::vector + (std::move (minimal_symbols)); PARSER_EXPLICIT (parser)->function_name = name.release (); } else @@ -1890,7 +1892,7 @@ linespec_parse_basic (linespec_parser *parser) { PARSER_RESULT (parser)->labels.label_symbols = labels; PARSER_RESULT (parser)->labels.function_symbols - = new std::vector (std::move (symbols)); + = new std::vector (std::move (symbols)); PARSER_EXPLICIT (parser)->label_name = name.release (); } else if (token.type == LSTOKEN_STRING @@ -1996,7 +1998,7 @@ linespec_parse_basic (linespec_parser *parser) { PARSER_RESULT (parser)->labels.label_symbols = labels; PARSER_RESULT (parser)->labels.function_symbols - = new std::vector (std::move (symbols)); + = new std::vector (std::move (symbols)); PARSER_EXPLICIT (parser)->label_name = name.release (); } else @@ -2066,8 +2068,9 @@ canonicalize_linespec (struct linespec_state *state, const linespec_p ls) /* No function was specified, so add the symbol name. */ gdb_assert (!ls->labels.function_symbols->empty () && (ls->labels.function_symbols->size () == 1)); - struct symbol *s = ls->labels.function_symbols->front (); - explicit_loc->function_name = xstrdup (SYMBOL_NATURAL_NAME (s)); + block_symbol s = ls->labels.function_symbols->front (); + explicit_loc->function_name + = xstrdup (SYMBOL_NATURAL_NAME (s.symbol)); } } @@ -2107,9 +2110,8 @@ create_sals_line_offset (struct linespec_state *self, set_default_source_symtab_and_line (); initialize_defaults (&self->default_symtab, &self->default_line); fullname = symtab_to_fullname (self->default_symtab); - symtab_vector_up r = - collect_symtabs_from_filename (fullname, self->search_pspace); - ls->file_symtabs = r.release (); + *ls->file_symtabs + = collect_symtabs_from_filename (fullname, self->search_pspace); use_default = 1; } @@ -2243,15 +2245,17 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (ls->labels.label_symbols != NULL) { /* We have just a bunch of functions/methods or labels. */ + struct symtab_and_line sal; + for (const auto &sym : *ls->labels.label_symbols) { - struct symtab_and_line sal; - struct program_space *pspace = SYMTAB_PSPACE (symbol_symtab (sym)); + struct program_space *pspace + = SYMTAB_PSPACE (symbol_symtab (sym.symbol)); - if (symbol_to_sal (&sal, state->funfirstline, sym) + 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), 0); + SYMBOL_NATURAL_NAME (sym.symbol), 0); } } else if (ls->function_symbols != NULL || ls->minimal_symbols != NULL) @@ -2263,11 +2267,12 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) to each other. */ std::sort (ls->function_symbols->begin (), ls->function_symbols->end (), - std_compare_symbols); + compare_symbols); for (const auto &sym : *ls->function_symbols) { - program_space *pspace = SYMTAB_PSPACE (symbol_symtab (sym)); + program_space *pspace + = SYMTAB_PSPACE (symbol_symtab (sym.symbol)); set_current_program_space (pspace); /* Don't skip to the first line of the function if we @@ -2278,25 +2283,21 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (state->funfirstline && ls->minimal_symbols != NULL - && SYMBOL_CLASS (sym) == LOC_BLOCK) + && SYMBOL_CLASS (sym.symbol) == LOC_BLOCK) { const CORE_ADDR addr - = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym)); + = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym.symbol)); - bound_minimal_symbol_d *elem; - for (int m = 0; - VEC_iterate (bound_minimal_symbol_d, ls->minimal_symbols, - m, elem); - ++m) + for (const auto &elem : *ls->minimal_symbols) { - if (MSYMBOL_TYPE (elem->minsym) == mst_text_gnu_ifunc - || MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) + if (MSYMBOL_TYPE (elem.minsym) == mst_text_gnu_ifunc + || MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc) { - CORE_ADDR msym_addr = BMSYMBOL_VALUE_ADDRESS (*elem); - if (MSYMBOL_TYPE (elem->minsym) == mst_data_gnu_ifunc) + CORE_ADDR msym_addr = BMSYMBOL_VALUE_ADDRESS (elem); + if (MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc) { struct gdbarch *gdbarch - = get_objfile_arch (elem->objfile); + = get_objfile_arch (elem.objfile); msym_addr = (gdbarch_convert_from_func_ptr_addr (gdbarch, @@ -2316,10 +2317,10 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (!found_ifunc) { symtab_and_line sal; - if (symbol_to_sal (&sal, state->funfirstline, sym) + 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), 0); + SYMBOL_NATURAL_NAME (sym.symbol), 0); } } } @@ -2327,20 +2328,15 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (ls->minimal_symbols != NULL) { /* Sort minimal symbols by program space, too */ - qsort (VEC_address (bound_minimal_symbol_d, ls->minimal_symbols), - VEC_length (bound_minimal_symbol_d, ls->minimal_symbols), - sizeof (bound_minimal_symbol_d), compare_msymbols); + std::sort (ls->minimal_symbols->begin (), + ls->minimal_symbols->end (), + compare_msymbols); - bound_minimal_symbol_d *elem; - - for (int i = 0; - VEC_iterate (bound_minimal_symbol_d, ls->minimal_symbols, - i, elem); - ++i) + for (const auto &elem : *ls->minimal_symbols) { - program_space *pspace = elem->objfile->pspace; + program_space *pspace = elem.objfile->pspace; set_current_program_space (pspace); - minsym_found (state, elem->objfile, elem->minsym, &sals); + minsym_found (state, elem.objfile, elem.minsym, &sals); } } } @@ -2387,9 +2383,9 @@ convert_explicit_location_to_linespec (struct linespec_state *self, const char *label_name, struct line_offset line_offset) { - std::vector symbols; - std::vector *labels; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector symbols; + std::vector *labels; + std::vector minimal_symbols; result->explicit_loc.func_name_match_type = fname_match_type; @@ -2397,9 +2393,8 @@ convert_explicit_location_to_linespec (struct linespec_state *self, { TRY { - result->file_symtabs - = symtabs_from_filename (source_filename, - self->search_pspace).release (); + *result->file_symtabs + = symtabs_from_filename (source_filename, self->search_pspace); } CATCH (except, RETURN_MASK_ERROR) { @@ -2420,14 +2415,15 @@ convert_explicit_location_to_linespec (struct linespec_state *self, function_name, fname_match_type, &symbols, &minimal_symbols); - if (symbols.empty () && minimal_symbols == NULL) + if (symbols.empty () && minimal_symbols.empty ()) symbol_not_found_error (function_name, result->explicit_loc.source_filename); result->explicit_loc.function_name = xstrdup (function_name); result->function_symbols - = new std::vector (std::move (symbols)); - result->minimal_symbols = minimal_symbols; + = new std::vector (std::move (symbols)); + result->minimal_symbols + = new std::vector (std::move (minimal_symbols)); } if (label_name != NULL) @@ -2442,7 +2438,7 @@ convert_explicit_location_to_linespec (struct linespec_state *self, result->explicit_loc.label_name = xstrdup (label_name); result->labels.label_symbols = labels; result->labels.function_symbols - = new std::vector (std::move (symbols)); + = new std::vector (std::move (symbols)); } if (line_offset.sign != LINE_OFFSET_UNKNOWN) @@ -2622,10 +2618,9 @@ parse_linespec (linespec_parser *parser, const char *arg, /* Check if the input is a filename. */ TRY { - symtab_vector_up r + *PARSER_RESULT (parser)->file_symtabs = symtabs_from_filename (user_filename.get (), PARSER_STATE (parser)->search_pspace); - PARSER_RESULT (parser)->file_symtabs = r.release (); } CATCH (ex, RETURN_MASK_ERROR) { @@ -2737,22 +2732,19 @@ linespec_state_constructor (struct linespec_state *self, /* Initialize a new linespec parser. */ -static void -linespec_parser_new (linespec_parser *parser, - int flags, const struct language_defn *language, - struct program_space *search_pspace, - struct symtab *default_symtab, - int default_line, - struct linespec_result *canonical) +linespec_parser::linespec_parser (int flags, + const struct language_defn *language, + struct program_space *search_pspace, + struct symtab *default_symtab, + int default_line, + struct linespec_result *canonical) { - memset (parser, 0, sizeof (linespec_parser)); - parser->lexer.current.type = LSTOKEN_CONSUMED; - memset (PARSER_RESULT (parser), 0, sizeof (struct linespec)); - PARSER_RESULT (parser)->file_symtabs = new std::vector (); - PARSER_EXPLICIT (parser)->func_name_match_type + lexer.current.type = LSTOKEN_CONSUMED; + PARSER_RESULT (this)->file_symtabs = new std::vector (); + PARSER_EXPLICIT (this)->func_name_match_type = symbol_name_match_type::WILD; - PARSER_EXPLICIT (parser)->line_offset.sign = LINE_OFFSET_UNKNOWN; - linespec_state_constructor (PARSER_STATE (parser), flags, language, + PARSER_EXPLICIT (this)->line_offset.sign = LINE_OFFSET_UNKNOWN; + linespec_state_constructor (PARSER_STATE (this), flags, language, search_pspace, default_symtab, default_line, canonical); } @@ -2763,29 +2755,24 @@ static void linespec_state_destructor (struct linespec_state *self) { htab_delete (self->addr_set); + xfree (self->canonical_names); } /* Delete a linespec parser. */ -static void -linespec_parser_delete (void *arg) +linespec_parser::~linespec_parser () { - linespec_parser *parser = (linespec_parser *) arg; - - xfree (PARSER_EXPLICIT (parser)->source_filename); - xfree (PARSER_EXPLICIT (parser)->label_name); - xfree (PARSER_EXPLICIT (parser)->function_name); - - delete PARSER_RESULT (parser)->file_symtabs; - delete PARSER_RESULT (parser)->function_symbols; - - if (PARSER_RESULT (parser)->minimal_symbols != NULL) - VEC_free (bound_minimal_symbol_d, PARSER_RESULT (parser)->minimal_symbols); + xfree (PARSER_EXPLICIT (this)->source_filename); + xfree (PARSER_EXPLICIT (this)->label_name); + xfree (PARSER_EXPLICIT (this)->function_name); - delete PARSER_RESULT (parser)->labels.label_symbols; - delete PARSER_RESULT (parser)->labels.function_symbols; + delete PARSER_RESULT (this)->file_symtabs; + delete PARSER_RESULT (this)->function_symbols; + delete PARSER_RESULT (this)->minimal_symbols; + delete PARSER_RESULT (this)->labels.label_symbols; + delete PARSER_RESULT (this)->labels.function_symbols; - linespec_state_destructor (PARSER_STATE (parser)); + linespec_state_destructor (PARSER_STATE (this)); } /* See description in linespec.h. */ @@ -2793,16 +2780,13 @@ linespec_parser_delete (void *arg) void linespec_lex_to_end (const char **stringp) { - linespec_parser parser; - struct cleanup *cleanup; linespec_token token; const char *orig; if (stringp == NULL || *stringp == NULL) return; - linespec_parser_new (&parser, 0, current_language, NULL, NULL, 0, NULL); - cleanup = make_cleanup (linespec_parser_delete, &parser); + linespec_parser parser (0, current_language, NULL, NULL, 0, NULL); parser.lexer.saved_arg = *stringp; PARSER_STREAM (&parser) = orig = *stringp; @@ -2818,7 +2802,6 @@ linespec_lex_to_end (const char **stringp) while (token.type != LSTOKEN_EOI && token.type != LSTOKEN_KEYWORD); *stringp += PARSER_STREAM (&parser) - orig; - do_cleanups (cleanup); } /* See linespec.h. */ @@ -2916,8 +2899,8 @@ complete_label (completion_tracker &tracker, linespec_parser *parser, const char *label_name) { - std::vector label_function_symbols; - std::vector *labels + std::vector label_function_symbols; + std::vector *labels = find_label_symbols (PARSER_STATE (parser), PARSER_RESULT (parser)->function_symbols, &label_function_symbols, @@ -2927,7 +2910,7 @@ complete_label (completion_tracker &tracker, { for (const auto &label : *labels) { - char *match = xstrdup (SYMBOL_SEARCH_NAME (label)); + char *match = xstrdup (SYMBOL_SEARCH_NAME (label.symbol)); tracker.add_completion (gdb::unique_xmalloc_ptr (match)); } delete labels; @@ -2944,11 +2927,7 @@ linespec_complete_label (completion_tracker &tracker, symbol_name_match_type func_name_match_type, const char *label_name) { - linespec_parser parser; - struct cleanup *cleanup; - - linespec_parser_new (&parser, 0, language, NULL, NULL, 0, NULL); - cleanup = make_cleanup (linespec_parser_delete, &parser); + linespec_parser parser (0, language, NULL, NULL, 0, NULL); line_offset unknown_offset = { 0, LINE_OFFSET_UNKNOWN }; @@ -2963,14 +2942,11 @@ linespec_complete_label (completion_tracker &tracker, } CATCH (ex, RETURN_MASK_ERROR) { - do_cleanups (cleanup); return; } END_CATCH complete_label (tracker, &parser, label_name); - - do_cleanups (cleanup); } /* See description in linespec.h. */ @@ -2979,12 +2955,9 @@ void linespec_complete (completion_tracker &tracker, const char *text, symbol_name_match_type match_type) { - linespec_parser parser; - struct cleanup *cleanup; const char *orig = text; - linespec_parser_new (&parser, 0, current_language, NULL, NULL, 0, NULL); - cleanup = make_cleanup (linespec_parser_delete, &parser); + linespec_parser parser (0, current_language, NULL, NULL, 0, NULL); parser.lexer.saved_arg = text; PARSER_EXPLICIT (&parser)->func_name_match_type = match_type; PARSER_STREAM (&parser) = text; @@ -3040,16 +3013,17 @@ linespec_complete (completion_tracker &tracker, const char *text, const char *func_name = PARSER_EXPLICIT (&parser)->function_name; - std::vector function_symbols; - VEC (bound_minimal_symbol_d) *minimal_symbols; + std::vector function_symbols; + std::vector minimal_symbols; find_linespec_symbols (PARSER_STATE (&parser), PARSER_RESULT (&parser)->file_symtabs, func_name, match_type, &function_symbols, &minimal_symbols); PARSER_RESULT (&parser)->function_symbols - = new std::vector (std::move (function_symbols)); - PARSER_RESULT (&parser)->minimal_symbols = minimal_symbols; + = new std::vector (std::move (function_symbols)); + PARSER_RESULT (&parser)->minimal_symbols + = new std::vector (std::move (minimal_symbols)); complete_label (tracker, &parser, parser.completion_word); } @@ -3166,8 +3140,6 @@ linespec_complete (completion_tracker &tracker, const char *text, NULL); } } - - do_cleanups (cleanup); } /* A helper function for decode_line_full and decode_line_1 to @@ -3249,9 +3221,7 @@ decode_line_full (const struct event_location *location, int flags, const char *select_mode, const char *filter) { - struct cleanup *cleanups; std::vector filters; - linespec_parser parser; struct linespec_state *state; gdb_assert (canonical != NULL); @@ -3263,10 +3233,9 @@ decode_line_full (const struct event_location *location, int flags, || select_mode == multiple_symbols_cancel); gdb_assert ((flags & DECODE_LINE_LIST_MODE) == 0); - linespec_parser_new (&parser, flags, current_language, - search_pspace, default_symtab, - default_line, canonical); - cleanups = make_cleanup (linespec_parser_delete, &parser); + linespec_parser parser (flags, current_language, + search_pspace, default_symtab, + default_line, canonical); scoped_restore_current_program_space restore_pspace; @@ -3278,16 +3247,11 @@ decode_line_full (const struct event_location *location, int flags, canonical->pre_expanded = 1; /* Arrange for allocated canonical names to be freed. */ - if (!result.empty ()) + std::vector> hold_names; + for (int i = 0; i < result.size (); ++i) { - int i; - - make_cleanup (xfree, state->canonical_names); - for (i = 0; i < result.size (); ++i) - { - gdb_assert (state->canonical_names[i].suffix != NULL); - make_cleanup (xfree, state->canonical_names[i].suffix); - } + gdb_assert (state->canonical_names[i].suffix != NULL); + hold_names.emplace_back (state->canonical_names[i].suffix); } if (select_mode == NULL) @@ -3310,8 +3274,6 @@ decode_line_full (const struct event_location *location, int flags, } else decode_line_2 (state, &result, select_mode); - - do_cleanups (cleanups); } /* See linespec.h. */ @@ -3322,21 +3284,13 @@ decode_line_1 (const struct event_location *location, int flags, struct symtab *default_symtab, int default_line) { - linespec_parser parser; - struct cleanup *cleanups; - - linespec_parser_new (&parser, flags, current_language, - search_pspace, default_symtab, - default_line, NULL); - cleanups = make_cleanup (linespec_parser_delete, &parser); + linespec_parser parser (flags, current_language, + search_pspace, default_symtab, + default_line, NULL); scoped_restore_current_program_space restore_pspace; - std::vector result = event_location_to_sals (&parser, - location); - - do_cleanups (cleanups); - return result; + return event_location_to_sals (&parser, location); } /* See linespec.h. */ @@ -3447,9 +3401,10 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) info.file_symtabs = &symtabs; - std::vector symbols; + std::vector symbols; info.result.symbols = &symbols; - info.result.minimal_symbols = NULL; + std::vector minimal_symbols; + info.result.minimal_symbols = &minimal_symbols; new_argptr = find_imps (arg, &symbol_names); if (symbol_names.empty ()) @@ -3459,8 +3414,7 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) FUNCTIONS_DOMAIN); std::vector values; - if (!symbols.empty () - || !VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) + if (!symbols.empty () || !minimal_symbols.empty ()) { char *saved_arg; @@ -3469,8 +3423,10 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg) saved_arg[new_argptr - arg] = '\0'; ls->explicit_loc.function_name = xstrdup (saved_arg); - ls->function_symbols = new std::vector (std::move (symbols)); - ls->minimal_symbols = info.result.minimal_symbols; + ls->function_symbols + = new std::vector (std::move (symbols)); + ls->minimal_symbols + = new std::vector (std::move (minimal_symbols)); values = convert_linespec_to_sals (self, ls); if (self->canonical) @@ -3507,7 +3463,6 @@ class decode_compound_collector { public: decode_compound_collector () - : m_symbols (NULL) { m_unique_syms = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer, NULL, @@ -3520,16 +3475,14 @@ public: htab_delete (m_unique_syms); } - /* Releases ownership of the collected symbols and returns them. */ - VEC (symbolp) *release_symbols () + /* Return all symbols collected. */ + std::vector release_symbols () { - VEC (symbolp) *res = m_symbols; - m_symbols = NULL; - return res; + return std::move (m_symbols); } /* Callable as a symbol_found_callback_ftype callback. */ - bool operator () (symbol *sym); + bool operator () (block_symbol *bsym); private: /* A hash table of all symbols we found. We use this to avoid @@ -3537,14 +3490,15 @@ private: htab_t m_unique_syms; /* The result vector. */ - VEC (symbolp) *m_symbols; + std::vector m_symbols; }; bool -decode_compound_collector::operator () (symbol *sym) +decode_compound_collector::operator () (block_symbol *bsym) { void **slot; struct type *t; + struct symbol *sym = bsym->symbol; if (SYMBOL_CLASS (sym) != LOC_TYPEDEF) return true; /* Continue iterating. */ @@ -3560,7 +3514,7 @@ decode_compound_collector::operator () (symbol *sym) if (!*slot) { *slot = sym; - VEC_safe_push (symbolp, m_symbols, sym); + m_symbols.push_back (*bsym); } return true; /* Continue iterating. */ @@ -3570,7 +3524,7 @@ decode_compound_collector::operator () (symbol *sym) /* Return any symbols corresponding to CLASS_NAME in FILE_SYMTABS. */ -static VEC (symbolp) * +static std::vector lookup_prefix_sym (struct linespec_state *state, std::vector *file_symtabs, const char *class_name) @@ -3609,20 +3563,20 @@ lookup_prefix_sym (struct linespec_state *state, symbols with the same program space end up next to each other. */ static bool -std_compare_symbols (const struct symbol *a, const struct symbol *b) +compare_symbols (const block_symbol &a, const block_symbol &b) { uintptr_t uia, uib; - uia = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (a)); - uib = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (b)); + uia = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (a.symbol)); + uib = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (b.symbol)); if (uia < uib) return true; if (uia > uib) return false; - uia = (uintptr_t) a; - uib = (uintptr_t) b; + uia = (uintptr_t) a.symbol; + uib = (uintptr_t) b.symbol; if (uia < uib) return true; @@ -3630,64 +3584,28 @@ std_compare_symbols (const struct symbol *a, const struct symbol *b) return false; } -/* A qsort comparison function for symbols. The resulting order does - not actually matter; we just need to be able to sort them so that - symbols with the same program space end up next to each other. */ - -static int -compare_symbols (const void *a, const void *b) -{ - struct symbol * const *sa = (struct symbol * const*) a; - struct symbol * const *sb = (struct symbol * const*) b; - uintptr_t uia, uib; - - uia = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (*sa)); - uib = (uintptr_t) SYMTAB_PSPACE (symbol_symtab (*sb)); - - if (uia < uib) - return -1; - if (uia > uib) - return 1; - - uia = (uintptr_t) *sa; - uib = (uintptr_t) *sb; - - if (uia < uib) - return -1; - if (uia > uib) - return 1; - - return 0; -} - /* Like compare_symbols but for minimal symbols. */ -static int -compare_msymbols (const void *a, const void *b) +static bool +compare_msymbols (const bound_minimal_symbol &a, const bound_minimal_symbol &b) { - const struct bound_minimal_symbol *sa - = (const struct bound_minimal_symbol *) a; - const struct bound_minimal_symbol *sb - = (const struct bound_minimal_symbol *) b; uintptr_t uia, uib; - uia = (uintptr_t) sa->objfile->pspace; - uib = (uintptr_t) sa->objfile->pspace; + uia = (uintptr_t) a.objfile->pspace; + uib = (uintptr_t) a.objfile->pspace; if (uia < uib) - return -1; + return true; if (uia > uib) - return 1; + return false; - uia = (uintptr_t) sa->minsym; - uib = (uintptr_t) sb->minsym; + uia = (uintptr_t) a.minsym; + uib = (uintptr_t) b.minsym; if (uia < uib) - return -1; - if (uia > uib) - return 1; + return true; - return 0; + return false; } /* Look for all the matching instances of each symbol in NAMES. Only @@ -3735,11 +3653,10 @@ find_superclass_methods (std::vector &&superclasses, static void find_method (struct linespec_state *self, std::vector *file_symtabs, const char *class_name, const char *method_name, - VEC (symbolp) *sym_classes, std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *sym_classes, + std::vector *symbols, + std::vector *minsyms) { - struct symbol *sym; - int ix; size_t last_result_len; std::vector superclass_vec; std::vector result_names; @@ -3747,15 +3664,13 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, /* Sort symbols so that symbols with the same program space are next to each other. */ - qsort (VEC_address (symbolp, sym_classes), - VEC_length (symbolp, sym_classes), - sizeof (symbolp), - compare_symbols); + std::sort (sym_classes->begin (), sym_classes->end (), + compare_symbols); info.state = self; info.file_symtabs = file_symtabs; info.result.symbols = symbols; - info.result.minimal_symbols = NULL; + info.result.minimal_symbols = minsyms; /* Iterate over all the types, looking for the names of existing methods matching METHOD_NAME. If we cannot find a direct method in a @@ -3767,10 +3682,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; - for (ix = 0; VEC_iterate (symbolp, sym_classes, ix, sym); ++ix) + unsigned int ix = 0; + for (const auto &elt : *sym_classes) { struct type *t; struct program_space *pspace; + struct symbol *sym = elt.symbol; /* Program spaces that are executing startup should have been filtered out earlier. */ @@ -3783,10 +3700,9 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, /* Handle all items from a single program space at once; and be sure not to miss the last batch. */ - if (ix == VEC_length (symbolp, sym_classes) - 1 + if (ix == sym_classes->size () - 1 || (pspace - != SYMTAB_PSPACE (symbol_symtab (VEC_index (symbolp, sym_classes, - ix + 1))))) + != SYMTAB_PSPACE (symbol_symtab (sym_classes->at (ix + 1).symbol)))) { /* If we did not find a direct implementation anywhere in this program space, consider superclasses. */ @@ -3802,15 +3718,12 @@ find_method (struct linespec_state *self, std::vector *file_symtabs, superclass_vec.clear (); last_result_len = result_names.size (); + ++ix; } } - if (!symbols->empty () - || !VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) - { - *minsyms = info.result.minimal_symbols; - return; - } + if (!symbols->empty () || !minsyms->empty ()) + return; /* Throw an NOT_FOUND_ERROR. This will be caught by the caller and other attempts to locate the symbol will be made. */ @@ -3828,7 +3741,6 @@ class symtab_collector { public: symtab_collector () - : m_symtabs (new std::vector ()) { m_symtab_table = htab_create (1, htab_hash_pointer, htab_eq_pointer, NULL); @@ -3843,15 +3755,15 @@ public: /* Callable as a symbol_found_callback_ftype callback. */ bool operator () (symtab *sym); - /* Releases ownership of the collected symtabs and returns them. */ - symtab_vector_up release_symtabs () + /* Return an rvalue reference to the collected symtabs. */ + std::vector &&release_symtabs () { return std::move (m_symtabs); } private: /* The result vector of symtabs. */ - symtab_vector_up m_symtabs; + std::vector m_symtabs; /* This is used to ensure the symtabs are unique. */ htab_t m_symtab_table; @@ -3866,7 +3778,7 @@ symtab_collector::operator () (struct symtab *symtab) if (!*slot) { *slot = symtab; - m_symtabs->push_back (symtab); + m_symtabs.push_back (symtab); } return false; @@ -3878,7 +3790,7 @@ symtab_collector::operator () (struct symtab *symtab) SEARCH_PSPACE is not NULL, the search is restricted to just that program space. */ -static symtab_vector_up +static std::vector collect_symtabs_from_filename (const char *file, struct program_space *search_pspace) { @@ -3910,14 +3822,14 @@ collect_symtabs_from_filename (const char *file, /* Return all the symtabs associated to the FILENAME. If SEARCH_PSPACE is not NULL, the search is restricted to just that program space. */ -static symtab_vector_up +static std::vector symtabs_from_filename (const char *filename, struct program_space *search_pspace) { - symtab_vector_up result + std::vector result = collect_symtabs_from_filename (filename, search_pspace); - if (result->empty ()) + if (result.empty ()) { if (!have_full_symbols () && !have_partial_symbols ()) throw_error (NOT_FOUND_ERROR, @@ -3929,6 +3841,36 @@ symtabs_from_filename (const char *filename, return result; } +/* See symtab.h. */ + +void +symbol_searcher::find_all_symbols (const std::string &name, + const struct language_defn *language, + enum search_domain search_domain, + std::vector *search_symtabs, + struct program_space *search_pspace) +{ + symbol_searcher_collect_info info; + struct linespec_state state; + + memset (&state, 0, sizeof (state)); + state.language = language; + info.state = &state; + + info.result.symbols = &m_symbols; + info.result.minimal_symbols = &m_minimal_symbols; + std::vector all_symtabs; + if (search_symtabs == nullptr) + { + all_symtabs.push_back (nullptr); + search_symtabs = &all_symtabs; + } + info.file_symtabs = search_symtabs; + + add_matching_symbols_to_info (name.c_str (), symbol_name_match_type::WILD, + search_domain, &info, search_pspace); +} + /* Look up a function symbol named NAME in symtabs FILE_SYMTABS. Matching debug symbols are returned in SYMBOLS. Matching minimal symbols are returned in MINSYMS. */ @@ -3937,15 +3879,15 @@ static void find_function_symbols (struct linespec_state *state, std::vector *file_symtabs, const char *name, symbol_name_match_type name_match_type, - std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *symbols, + std::vector *minsyms) { struct collect_info info; std::vector symbol_names; info.state = state; info.result.symbols = symbols; - info.result.minimal_symbols = NULL; + info.result.minimal_symbols = minsyms; info.file_symtabs = file_symtabs; /* Try NAME as an Objective-C selector. */ @@ -3956,14 +3898,6 @@ find_function_symbols (struct linespec_state *state, else add_matching_symbols_to_info (name, name_match_type, FUNCTIONS_DOMAIN, &info, state->search_pspace); - - if (VEC_empty (bound_minimal_symbol_d, info.result.minimal_symbols)) - { - VEC_free (bound_minimal_symbol_d, info.result.minimal_symbols); - *minsyms = NULL; - } - else - *minsyms = info.result.minimal_symbols; } /* Find all symbols named NAME in FILE_SYMTABS, returning debug symbols @@ -3974,8 +3908,8 @@ find_linespec_symbols (struct linespec_state *state, std::vector *file_symtabs, const char *lookup_name, symbol_name_match_type name_match_type, - std::vector *symbols, - VEC (bound_minimal_symbol_d) **minsyms) + std::vector *symbols, + std::vector *minsyms) { std::string canon = cp_canonicalize_string_no_typedefs (lookup_name); if (!canon.empty ()) @@ -3996,12 +3930,10 @@ find_linespec_symbols (struct linespec_state *state, /* If we were unable to locate a symbol of the same name, try dividing the name into class and method names and searching the class and its baseclasses. */ - if (symbols->empty () - && VEC_empty (bound_minimal_symbol_d, *minsyms)) + if (symbols->empty () && minsyms->empty ()) { std::string klass, method; const char *last, *p, *scope_op; - VEC (symbolp) *classes; /* See if we can find a scope operator and break this symbol name into namespaces${SCOPE_OPERATOR}class_name and method_name. */ @@ -4030,18 +3962,16 @@ find_linespec_symbols (struct linespec_state *state, method = last; /* Find a list of classes named KLASS. */ - classes = lookup_prefix_sym (state, file_symtabs, klass.c_str ()); - struct cleanup *old_chain - = make_cleanup (VEC_cleanup (symbolp), &classes); - - if (!VEC_empty (symbolp, classes)) + std::vector classes + = lookup_prefix_sym (state, file_symtabs, klass.c_str ()); + if (!classes.empty ()) { /* Now locate a list of suitable methods named METHOD. */ TRY { find_method (state, file_symtabs, klass.c_str (), method.c_str (), - classes, symbols, minsyms); + &classes, symbols, minsyms); } /* If successful, we're done. If NOT_FOUND_ERROR @@ -4053,8 +3983,6 @@ find_linespec_symbols (struct linespec_state *state, } END_CATCH } - - do_cleanups (old_chain); } } @@ -4069,8 +3997,8 @@ static void find_label_symbols_in_block (const struct block *block, const char *name, struct symbol *fn_sym, bool completion_mode, - std::vector *result, - std::vector *label_funcs_ret) + std::vector *result, + std::vector *label_funcs_ret) { if (completion_mode) { @@ -4087,19 +4015,20 @@ find_label_symbols_in_block (const struct block *block, SYMBOL_DOMAIN (sym), LABEL_DOMAIN) && cmp (SYMBOL_SEARCH_NAME (sym), name, name_len) == 0) { - result->push_back (sym); - label_funcs_ret->push_back (fn_sym); + result->push_back ({sym, block}); + label_funcs_ret->push_back ({fn_sym, block}); } } } else { - struct symbol *sym = lookup_symbol (name, block, LABEL_DOMAIN, 0).symbol; + struct block_symbol label_sym + = lookup_symbol (name, block, LABEL_DOMAIN, 0); - if (sym != NULL) + if (label_sym.symbol != NULL) { - result->push_back (sym); - label_funcs_ret->push_back (fn_sym); + result->push_back (label_sym); + label_funcs_ret->push_back ({fn_sym, block}); } } } @@ -4112,15 +4041,17 @@ find_label_symbols_in_block (const struct block *block, interpreted as a label name prefix. Otherwise, only labels named exactly NAME match. */ -static std::vector * + +static std::vector * find_label_symbols (struct linespec_state *self, - std::vector *function_symbols, - std::vector *label_funcs_ret, const char *name, + std::vector *function_symbols, + std::vector *label_funcs_ret, + const char *name, bool completion_mode) { const struct block *block; struct symbol *fn_sym; - std::vector result; + std::vector result; if (function_symbols == NULL) { @@ -4142,16 +4073,17 @@ find_label_symbols (struct linespec_state *self, { for (const auto &elt : *function_symbols) { - set_current_program_space (SYMTAB_PSPACE (symbol_symtab (elt))); - block = SYMBOL_BLOCK_VALUE (elt); + fn_sym = elt.symbol; + set_current_program_space (SYMTAB_PSPACE (symbol_symtab (fn_sym))); + block = SYMBOL_BLOCK_VALUE (fn_sym); - find_label_symbols_in_block (block, name, elt, completion_mode, + find_label_symbols_in_block (block, name, fn_sym, completion_mode, &result, label_funcs_ret); } } if (!result.empty ()) - return new std::vector (std::move (result)); + return new std::vector (std::move (result)); return nullptr; } @@ -4418,8 +4350,6 @@ search_minsyms_for_name (struct collect_info *info, ALL_PSPACES (pspace) { - struct objfile *objfile; - if (search_pspace != NULL && search_pspace != pspace) continue; if (pspace->executing_startup) @@ -4427,17 +4357,17 @@ search_minsyms_for_name (struct collect_info *info, set_current_program_space (pspace); - ALL_OBJFILES (objfile) - { - iterate_over_minimal_symbols (objfile, name, - [&] (struct minimal_symbol *msym) + for (objfile *objfile : all_objfiles (current_program_space)) + { + iterate_over_minimal_symbols (objfile, name, + [&] (struct minimal_symbol *msym) { add_minsym (msym, objfile, nullptr, info->state->list_mode, &minsyms); return false; }); - } + } } } else @@ -4472,8 +4402,7 @@ search_minsyms_for_name (struct collect_info *info, if (classify_mtype (MSYMBOL_TYPE (item.minsym)) != classification) break; - VEC_safe_push (bound_minimal_symbol_d, - info->result.minimal_symbols, &item); + info->result.minimal_symbols->push_back (item); } } } @@ -4497,8 +4426,9 @@ add_matching_symbols_to_info (const char *name, { iterate_over_all_matching_symtabs (info->state, lookup_name, VAR_DOMAIN, search_domain, - pspace, true, [&] (symbol *sym) - { return info->add_symbol (sym); }); + pspace, true, + [&] (block_symbol *bsym) + { return info->add_symbol (bsym); }); search_minsyms_for_name (info, lookup_name, pspace, NULL); } else if (pspace == NULL || pspace == SYMTAB_PSPACE (elt)) @@ -4510,8 +4440,8 @@ add_matching_symbols_to_info (const char *name, gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup); set_current_program_space (SYMTAB_PSPACE (elt)); iterate_over_file_blocks (elt, lookup_name, VAR_DOMAIN, - [&] (symbol *sym) - { return info->add_symbol (sym); }); + [&] (block_symbol *bsym) + { return info->add_symbol (bsym); }); /* If no new symbols were found in this iteration and this symtab is in assembler, we might actually be looking for a label for