diff --git a/gdb/linespec.c b/gdb/linespec.c index 40e56be2013..edd5f917f3a 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -207,50 +207,48 @@ private: struct collect_info { + collect_info (linespec_state *state, + const std::vector &file_symtabs, + std::vector *symbols, + std::vector *minimal_symbols, + bool force_record_all = false) + : state (state), + /* In list mode, add all matching symbols, regardless of class. + This allows the user to type "list a_global_variable". */ + record_all (force_record_all || state->list_mode), + file_symtabs (file_symtabs), + symbols (symbols), + minimal_symbols (minimal_symbols) + { + } + /* The linespec object in use. */ struct linespec_state *state; - /* A list of symtabs to which to restrict matches. */ - const std::vector *file_symtabs; + /* True if all symbols should be recorded. */ + bool record_all; - /* The result being accumulated. */ - struct - { - std::vector *symbols; - std::vector *minimal_symbols; - } result; + /* A list of symtabs to which to restrict matches. */ + const std::vector &file_symtabs; + + /* The results being accumulated. */ + std::vector *symbols; + std::vector *minimal_symbols; /* Possibly add a symbol to the results. */ - virtual bool add_symbol (block_symbol *bsym); + bool add_symbol (block_symbol *bsym); }; bool 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 (bsym->symbol->loc_class () == LOC_BLOCK || this->state->list_mode) - this->result.symbols->push_back (*bsym); + if (record_all || bsym->symbol->loc_class () == LOC_BLOCK) + this->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 linespec_token_type @@ -3271,20 +3269,15 @@ linespec_expression_to_pc (const char **exp_ptr) static std::vector decode_objc (struct linespec_state *self, linespec *ls, const char *arg) { - struct collect_info info; - std::vector symbol_names; - const char *new_argptr; - - info.state = self; std::vector symtabs; symtabs.push_back (nullptr); - info.file_symtabs = &symtabs; - std::vector symbols; - info.result.symbols = &symbols; std::vector minimal_symbols; - info.result.minimal_symbols = &minimal_symbols; + + collect_info info (self, symtabs, &symbols, &minimal_symbols); + std::vector symbol_names; + const char *new_argptr; new_argptr = find_imps (arg, &symbol_names); if (symbol_names.empty ()) @@ -3538,18 +3531,13 @@ find_method (struct linespec_state *self, size_t last_result_len; std::vector superclass_vec; std::vector result_names; - struct collect_info info; + collect_info info (self, file_symtabs, symbols, minsyms); /* Sort symbols so that symbols with the same program space are next to each other. */ 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 = 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 given program space, then we consider inherited methods; this is @@ -3682,20 +3670,17 @@ symbol_searcher::find_all_symbols (const std::string &name, std::vector *search_symtabs, struct program_space *search_pspace) { - symbol_searcher_collect_info info; linespec_state state (language, current_program_space); - 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; + + collect_info info (&state, *search_symtabs, &m_symbols, + &m_minimal_symbols, true); add_matching_symbols_to_info (name.c_str (), symbol_name_match_type::WILD, domain_search_flags, &info, search_pspace); @@ -3712,14 +3697,9 @@ find_function_symbols (struct linespec_state *state, std::vector *symbols, std::vector *minsyms) { - struct collect_info info; + collect_info info (state, file_symtabs, symbols, minsyms); std::vector symbol_names; - info.state = state; - info.result.symbols = symbols; - info.result.minimal_symbols = minsyms; - info.file_symtabs = &file_symtabs; - /* Try NAME as an Objective-C selector. */ find_imps (name, &symbol_names); @@ -4252,7 +4232,7 @@ search_minsyms_for_name (struct collect_info *info, } if (!skip) - info->result.minimal_symbols->push_back (item); + info->minimal_symbols->push_back (item); } } @@ -4274,7 +4254,7 @@ add_matching_symbols_to_info (const char *name, return info->add_symbol (bsym); }; - for (const auto &elt : *info->file_symtabs) + for (const auto &elt : info->file_symtabs) { if (elt == nullptr) { @@ -4286,7 +4266,7 @@ add_matching_symbols_to_info (const char *name, } else if (pspace == NULL || pspace == elt->compunit ()->objfile ()->pspace ()) { - int prev_len = info->result.symbols->size (); + int prev_len = info->symbols->size (); /* Program spaces that are executing startup should have been filtered out earlier. */ @@ -4299,7 +4279,7 @@ add_matching_symbols_to_info (const char *name, is in assembler, we might actually be looking for a label for which we don't have debug info. Check for a minimal symbol in this case. */ - if (prev_len == info->result.symbols->size () + if (prev_len == info->symbols->size () && elt->language () == language_asm) search_minsyms_for_name (info, lookup_name, pspace, elt); }