| Index: gdb/findvar.c
|
| diff --git a/gdb/findvar.c b/gdb/findvar.c
|
| index 79c4221f73624b37100743390cdbd1c8aab46ad3..66bcebee3486e8e4bd726b7431dfeaadcaf303f0 100644
|
| --- a/gdb/findvar.c
|
| +++ b/gdb/findvar.c
|
| @@ -34,6 +34,7 @@
|
| #include "user-regs.h"
|
| #include "block.h"
|
| #include "objfiles.h"
|
| +#include "language.h"
|
|
|
| /* Basic byte-swapping routines. All 'extract' functions return a
|
| host-format integer from a target-format integer at ADDR which is
|
| @@ -405,13 +406,42 @@ symbol_read_needs_frame (struct symbol *sym)
|
| return 1;
|
| }
|
|
|
| -/* Given a struct symbol for a variable,
|
| - and a stack frame id, read the value of the variable
|
| - and return a (pointer to a) struct value containing the value.
|
| - If the variable cannot be found, throw error. */
|
| +/* Private data to be used with minsym_lookup_iterator_cb. */
|
| +
|
| +struct minsym_lookup_data
|
| +{
|
| + /* The name of the minimal symbol we are searching for. */
|
| + const char *name;
|
| +
|
| + /* The field where the callback should store the minimal symbol
|
| + if found. It should be initialized to NULL before the search
|
| + is started. */
|
| + struct minimal_symbol *result;
|
| +};
|
| +
|
| +/* A callback function for gdbarch_iterate_over_objfiles_in_search_order.
|
| + It searches by name for a minimal symbol within the given OBJFILE.
|
| + The arguments are passed via CB_DATA, which in reality is a pointer
|
| + to struct minsym_lookup_data. */
|
| +
|
| +static int
|
| +minsym_lookup_iterator_cb (struct objfile *objfile, void *cb_data)
|
| +{
|
| + struct minsym_lookup_data *data = (struct minsym_lookup_data *) cb_data;
|
| +
|
| + gdb_assert (data->result == NULL);
|
| +
|
| + data->result = lookup_minimal_symbol (data->name, NULL, objfile);
|
| +
|
| + /* The iterator should stop iff a match was found. */
|
| + return (data->result != NULL);
|
| +}
|
| +
|
| +/* A default implementation for the "la_read_var_value" hook in
|
| + the language vector which should work in most situations. */
|
|
|
| struct value *
|
| -read_var_value (struct symbol *var, struct frame_info *frame)
|
| +default_read_var_value (struct symbol *var, struct frame_info *frame)
|
| {
|
| struct value *v;
|
| struct type *type = SYMBOL_TYPE (var);
|
| @@ -560,10 +590,19 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|
|
| case LOC_UNRESOLVED:
|
| {
|
| + struct minsym_lookup_data lookup_data;
|
| struct minimal_symbol *msym;
|
| struct obj_section *obj_section;
|
|
|
| - msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
|
| + memset (&lookup_data, 0, sizeof (lookup_data));
|
| + lookup_data.name = SYMBOL_LINKAGE_NAME (var);
|
| +
|
| + gdbarch_iterate_over_objfiles_in_search_order
|
| + (get_objfile_arch (SYMBOL_SYMTAB (var)->objfile),
|
| + minsym_lookup_iterator_cb, &lookup_data,
|
| + SYMBOL_SYMTAB (var)->objfile);
|
| + msym = lookup_data.result;
|
| +
|
| if (msym == NULL)
|
| error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var));
|
| if (overlay_debugging)
|
| @@ -594,6 +633,19 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
| return v;
|
| }
|
|
|
| +/* Calls VAR's language la_read_var_value hook with the given arguments. */
|
| +
|
| +struct value *
|
| +read_var_value (struct symbol *var, struct frame_info *frame)
|
| +{
|
| + const struct language_defn *lang = language_def (SYMBOL_LANGUAGE (var));
|
| +
|
| + gdb_assert (lang != NULL);
|
| + gdb_assert (lang->la_read_var_value != NULL);
|
| +
|
| + return lang->la_read_var_value (var, frame);
|
| +}
|
| +
|
| /* Install default attributes for register values. */
|
|
|
| struct value *
|
|
|