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 * |