Remove some cleanups from search_minsyms_for_name
This changes struct collect_minsyms to use a std::vector, which enables the removal of a cleanup from search_minsyms_for_name. This also changes iterate_over_minimal_symbols to take a gdb::function_view, which makes a function in linespec.c more type-safe. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * minsyms.h (iterate_over_minimal_symbols): Update. * minsyms.c (iterate_over_minimal_symbols): Take a gdb::function_view. * linespec.c (struct collect_minsyms): Remove. (compare_msyms): Now a std::sort comparator. (add_minsym): Add parameters. (search_minsyms_for_name): Update. Use std::vector.
This commit is contained in:
parent
65bd20451f
commit
41c1efc614
|
@ -1,3 +1,13 @@
|
|||
2018-04-05 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* minsyms.h (iterate_over_minimal_symbols): Update.
|
||||
* minsyms.c (iterate_over_minimal_symbols): Take a
|
||||
gdb::function_view.
|
||||
* linespec.c (struct collect_minsyms): Remove.
|
||||
(compare_msyms): Now a std::sort comparator.
|
||||
(add_minsym): Add parameters.
|
||||
(search_minsyms_for_name): Update. Use std::vector.
|
||||
|
||||
2018-04-03 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* mipsread.c (read_alphacoff_dynamic_symtab): Use
|
||||
|
|
128
gdb/linespec.c
128
gdb/linespec.c
|
@ -46,6 +46,7 @@
|
|||
#include "location.h"
|
||||
#include "common/function-view.h"
|
||||
#include "common/def-vector.h"
|
||||
#include <algorithm>
|
||||
|
||||
/* An enumeration of the various things a user might attempt to
|
||||
complete for a linespec location. */
|
||||
|
@ -4370,27 +4371,6 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
|
|||
add_sal_to_sals (self, result, &sal, MSYMBOL_NATURAL_NAME (msymbol), 0);
|
||||
}
|
||||
|
||||
/* A helper struct to pass some data through
|
||||
iterate_over_minimal_symbols. */
|
||||
|
||||
struct collect_minsyms
|
||||
{
|
||||
/* The objfile we're examining. */
|
||||
struct objfile *objfile;
|
||||
|
||||
/* Only search the given symtab, or NULL to search for all symbols. */
|
||||
struct symtab *symtab;
|
||||
|
||||
/* The funfirstline setting from the initial call. */
|
||||
int funfirstline;
|
||||
|
||||
/* The list_mode setting from the initial call. */
|
||||
int list_mode;
|
||||
|
||||
/* The resulting symbols. */
|
||||
VEC (bound_minimal_symbol_d) *msyms;
|
||||
};
|
||||
|
||||
/* A helper function to classify a minimal_symbol_type according to
|
||||
priority. */
|
||||
|
||||
|
@ -4415,47 +4395,45 @@ classify_mtype (enum minimal_symbol_type t)
|
|||
}
|
||||
}
|
||||
|
||||
/* Callback for qsort that sorts symbols by priority. */
|
||||
/* Callback for std::sort that sorts symbols by priority. */
|
||||
|
||||
static int
|
||||
compare_msyms (const void *a, const void *b)
|
||||
static bool
|
||||
compare_msyms (const bound_minimal_symbol &a, const bound_minimal_symbol &b)
|
||||
{
|
||||
const bound_minimal_symbol_d *moa = (const bound_minimal_symbol_d *) a;
|
||||
const bound_minimal_symbol_d *mob = (const bound_minimal_symbol_d *) b;
|
||||
enum minimal_symbol_type ta = MSYMBOL_TYPE (moa->minsym);
|
||||
enum minimal_symbol_type tb = MSYMBOL_TYPE (mob->minsym);
|
||||
enum minimal_symbol_type ta = MSYMBOL_TYPE (a.minsym);
|
||||
enum minimal_symbol_type tb = MSYMBOL_TYPE (b.minsym);
|
||||
|
||||
return classify_mtype (ta) - classify_mtype (tb);
|
||||
return classify_mtype (ta) < classify_mtype (tb);
|
||||
}
|
||||
|
||||
/* Callback for iterate_over_minimal_symbols that adds the symbol to
|
||||
the result. */
|
||||
/* Helper for search_minsyms_for_name that adds the symbol to the
|
||||
result. */
|
||||
|
||||
static void
|
||||
add_minsym (struct minimal_symbol *minsym, void *d)
|
||||
add_minsym (struct minimal_symbol *minsym, struct objfile *objfile,
|
||||
struct symtab *symtab, int list_mode,
|
||||
std::vector<struct bound_minimal_symbol> *msyms)
|
||||
{
|
||||
struct collect_minsyms *info = (struct collect_minsyms *) d;
|
||||
|
||||
if (info->symtab != NULL)
|
||||
if (symtab != NULL)
|
||||
{
|
||||
/* We're looking for a label for which we don't have debug
|
||||
info. */
|
||||
CORE_ADDR func_addr;
|
||||
if (msymbol_is_function (info->objfile, minsym, &func_addr))
|
||||
if (msymbol_is_function (objfile, minsym, &func_addr))
|
||||
{
|
||||
symtab_and_line sal = find_pc_sect_line (func_addr, NULL, 0);
|
||||
|
||||
if (info->symtab != sal.symtab)
|
||||
if (symtab != sal.symtab)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Exclude data symbols when looking for breakpoint locations. */
|
||||
if (!info->list_mode && !msymbol_is_function (info->objfile, minsym))
|
||||
if (!list_mode && !msymbol_is_function (objfile, minsym))
|
||||
return;
|
||||
|
||||
bound_minimal_symbol_d mo = {minsym, info->objfile};
|
||||
VEC_safe_push (bound_minimal_symbol_d, info->msyms, &mo);
|
||||
struct bound_minimal_symbol mo = {minsym, objfile};
|
||||
msyms->push_back (mo);
|
||||
}
|
||||
|
||||
/* Search for minimal symbols called NAME. If SEARCH_PSPACE
|
||||
|
@ -4471,15 +4449,7 @@ search_minsyms_for_name (struct collect_info *info,
|
|||
struct program_space *search_pspace,
|
||||
struct symtab *symtab)
|
||||
{
|
||||
struct collect_minsyms local;
|
||||
struct cleanup *cleanup;
|
||||
|
||||
memset (&local, 0, sizeof (local));
|
||||
local.funfirstline = info->state->funfirstline;
|
||||
local.list_mode = info->state->list_mode;
|
||||
local.symtab = symtab;
|
||||
|
||||
cleanup = make_cleanup (VEC_cleanup (bound_minimal_symbol_d), &local.msyms);
|
||||
std::vector<struct bound_minimal_symbol> minsyms;
|
||||
|
||||
if (symtab == NULL)
|
||||
{
|
||||
|
@ -4498,8 +4468,13 @@ search_minsyms_for_name (struct collect_info *info,
|
|||
|
||||
ALL_OBJFILES (objfile)
|
||||
{
|
||||
local.objfile = objfile;
|
||||
iterate_over_minimal_symbols (objfile, name, add_minsym, &local);
|
||||
iterate_over_minimal_symbols (objfile, name,
|
||||
[&] (struct minimal_symbol *msym)
|
||||
{
|
||||
add_minsym (msym, objfile, nullptr,
|
||||
info->state->list_mode,
|
||||
&minsyms);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4508,41 +4483,36 @@ search_minsyms_for_name (struct collect_info *info,
|
|||
if (search_pspace == NULL || SYMTAB_PSPACE (symtab) == search_pspace)
|
||||
{
|
||||
set_current_program_space (SYMTAB_PSPACE (symtab));
|
||||
local.objfile = SYMTAB_OBJFILE(symtab);
|
||||
iterate_over_minimal_symbols (local.objfile, name, add_minsym, &local);
|
||||
iterate_over_minimal_symbols
|
||||
(SYMTAB_OBJFILE (symtab), name,
|
||||
[&] (struct minimal_symbol *msym)
|
||||
{
|
||||
add_minsym (msym, SYMTAB_OBJFILE (symtab), symtab,
|
||||
info->state->list_mode, &minsyms);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!VEC_empty (bound_minimal_symbol_d, local.msyms))
|
||||
{
|
||||
int classification;
|
||||
int ix;
|
||||
bound_minimal_symbol_d *item;
|
||||
if (!minsyms.empty ())
|
||||
{
|
||||
int classification;
|
||||
|
||||
qsort (VEC_address (bound_minimal_symbol_d, local.msyms),
|
||||
VEC_length (bound_minimal_symbol_d, local.msyms),
|
||||
sizeof (bound_minimal_symbol_d),
|
||||
compare_msyms);
|
||||
std::sort (minsyms.begin (), minsyms.end (), compare_msyms);
|
||||
|
||||
/* Now the minsyms are in classification order. So, we walk
|
||||
over them and process just the minsyms with the same
|
||||
classification as the very first minsym in the list. */
|
||||
item = VEC_index (bound_minimal_symbol_d, local.msyms, 0);
|
||||
classification = classify_mtype (MSYMBOL_TYPE (item->minsym));
|
||||
/* Now the minsyms are in classification order. So, we walk
|
||||
over them and process just the minsyms with the same
|
||||
classification as the very first minsym in the list. */
|
||||
classification = classify_mtype (MSYMBOL_TYPE (minsyms[0].minsym));
|
||||
|
||||
for (ix = 0;
|
||||
VEC_iterate (bound_minimal_symbol_d, local.msyms, ix, item);
|
||||
++ix)
|
||||
{
|
||||
if (classify_mtype (MSYMBOL_TYPE (item->minsym)) != classification)
|
||||
break;
|
||||
for (const struct bound_minimal_symbol &item : minsyms)
|
||||
{
|
||||
if (classify_mtype (MSYMBOL_TYPE (item.minsym)) != classification)
|
||||
break;
|
||||
|
||||
VEC_safe_push (bound_minimal_symbol_d,
|
||||
info->result.minimal_symbols, item);
|
||||
}
|
||||
}
|
||||
|
||||
do_cleanups (cleanup);
|
||||
VEC_safe_push (bound_minimal_symbol_d,
|
||||
info->result.minimal_symbols, &item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* A helper function to add all symbols matching NAME to INFO. If
|
||||
|
|
|
@ -469,13 +469,10 @@ linkage_name_str (const lookup_name_info &lookup_name)
|
|||
/* See minsyms.h. */
|
||||
|
||||
void
|
||||
iterate_over_minimal_symbols (struct objfile *objf,
|
||||
const lookup_name_info &lookup_name,
|
||||
void (*callback) (struct minimal_symbol *,
|
||||
void *),
|
||||
void *user_data)
|
||||
iterate_over_minimal_symbols
|
||||
(struct objfile *objf, const lookup_name_info &lookup_name,
|
||||
gdb::function_view<void (struct minimal_symbol *)> callback)
|
||||
{
|
||||
|
||||
/* The first pass is over the ordinary hash table. */
|
||||
{
|
||||
const char *name = linkage_name_str (lookup_name);
|
||||
|
@ -490,7 +487,7 @@ iterate_over_minimal_symbols (struct objfile *objf,
|
|||
iter = iter->hash_next)
|
||||
{
|
||||
if (mangled_cmp (MSYMBOL_LINKAGE_NAME (iter), name) == 0)
|
||||
(*callback) (iter, user_data);
|
||||
callback (iter);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -509,7 +506,7 @@ iterate_over_minimal_symbols (struct objfile *objf,
|
|||
iter != NULL;
|
||||
iter = iter->demangled_hash_next)
|
||||
if (name_match (MSYMBOL_SEARCH_NAME (iter), lookup_name, NULL))
|
||||
(*callback) (iter, user_data);
|
||||
callback (iter);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -265,14 +265,11 @@ struct bound_minimal_symbol lookup_minimal_symbol_by_pc (CORE_ADDR);
|
|||
are considered. The caller is responsible for canonicalizing NAME,
|
||||
should that need to be done.
|
||||
|
||||
For each matching symbol, CALLBACK is called with the symbol and
|
||||
USER_DATA as arguments. */
|
||||
For each matching symbol, CALLBACK is called with the symbol. */
|
||||
|
||||
void iterate_over_minimal_symbols (struct objfile *objf,
|
||||
const lookup_name_info &name,
|
||||
void (*callback) (struct minimal_symbol *,
|
||||
void *),
|
||||
void *user_data);
|
||||
void iterate_over_minimal_symbols
|
||||
(struct objfile *objf, const lookup_name_info &name,
|
||||
gdb::function_view<void (struct minimal_symbol *)> callback);
|
||||
|
||||
/* Compute the upper bound of MINSYM. The upper bound is the last
|
||||
address thought to be part of the symbol. If the symbol has a
|
||||
|
|
Loading…
Reference in New Issue