diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e7f3da7e408..9f4697af299 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2011-09-08 Jan Kratochvil + + * findvar.c (read_var_value): Never return NULL, throw an error + instead. Update the function comment. State symbol name in the error + messages. + * python/py-frame.c (frapy_read_var): Remove handling of NULL from + read_var_value. + * stack.c (print_frame_args): Likewise. + * valops.c (value_of_variable): Likewise. + 2011-09-08 Jan Kratochvil * stack.c (print_frame_args): New variable except. Wrap diff --git a/gdb/findvar.c b/gdb/findvar.c index 69dc5a0ed30..8e986f11399 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -409,7 +409,7 @@ symbol_read_needs_frame (struct symbol *sym) /* 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, return a zero pointer. */ + If the variable cannot be found, throw error. */ struct value * read_var_value (struct symbol *var, struct frame_info *frame) @@ -477,7 +477,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) case LOC_ARG: addr = get_frame_args_address (frame); if (!addr) - return 0; + error (_("Unknown argument list address for `%s'."), + SYMBOL_PRINT_NAME (var)); addr += SYMBOL_VALUE (var); v = allocate_value_lazy (type); break; @@ -489,7 +490,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) argref = get_frame_args_address (frame); if (!argref) - return 0; + error (_("Unknown argument list address for `%s'."), + SYMBOL_PRINT_NAME (var)); argref += SYMBOL_VALUE (var); ref = value_at (lookup_pointer_type (type), argref); addr = value_as_address (ref); @@ -504,7 +506,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) break; case LOC_TYPEDEF: - error (_("Cannot look up value of a typedef")); + error (_("Cannot look up value of a typedef `%s'."), + SYMBOL_PRINT_NAME (var)); break; case LOC_BLOCK: @@ -530,7 +533,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) frame); if (regval == NULL) - error (_("Value of register variable not available.")); + error (_("Value of register variable not available for `%s'."), + SYMBOL_PRINT_NAME (var)); addr = value_as_address (regval); v = allocate_value_lazy (type); @@ -540,7 +544,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) regval = value_from_register (type, regno, frame); if (regval == NULL) - error (_("Value of register variable not available.")); + error (_("Value of register variable not available for `%s'."), + SYMBOL_PRINT_NAME (var)); return regval; } } @@ -561,7 +566,7 @@ read_var_value (struct symbol *var, struct frame_info *frame) msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL); if (msym == NULL) - return 0; + error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var)); if (overlay_debugging) addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (msym), SYMBOL_OBJ_SECTION (msym)); @@ -580,7 +585,8 @@ read_var_value (struct symbol *var, struct frame_info *frame) return allocate_optimized_out_value (type); default: - error (_("Cannot look up value of a botched symbol.")); + error (_("Cannot look up value of a botched symbol `%s'."), + SYMBOL_PRINT_NAME (var)); break; } diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 7efd13fef38..9143367aac0 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -467,14 +467,6 @@ frapy_read_var (PyObject *self, PyObject *args) } GDB_PY_HANDLE_EXCEPTION (except); - if (!val) - { - PyErr_Format (PyExc_ValueError, - _("Variable cannot be found for symbol '%s'."), - SYMBOL_NATURAL_NAME (var)); - return NULL; - } - return value_to_value_object (val); } diff --git a/gdb/stack.c b/gdb/stack.c index 3147f3e72fc..15666eec060 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -330,6 +330,9 @@ print_frame_args (struct symbol *func, struct frame_info *frame, TRY_CATCH (except, RETURN_MASK_ERROR) { + const struct language_defn *language; + struct value_print_options opts; + /* Avoid value_print because it will deref ref parameters. We just want to print their addresses. Print ??? for args whose address we do not know. We pass 2 as @@ -338,29 +341,21 @@ print_frame_args (struct symbol *func, struct frame_info *frame, recurse. */ val = read_var_value (sym, frame); - annotate_arg_value (val == NULL ? NULL : value_type (val)); + annotate_arg_value (value_type (val)); - if (val) - { - const struct language_defn *language; - struct value_print_options opts; - - /* Use the appropriate language to display our symbol, - unless the user forced the language to a specific - language. */ - if (language_mode == language_mode_auto) - language = language_def (SYMBOL_LANGUAGE (sym)); - else - language = current_language; - - get_raw_print_options (&opts); - opts.deref_ref = 0; - opts.summary = summary; - common_val_print (val, stb->stream, 2, &opts, language); - ui_out_field_stream (uiout, "value", stb); - } + /* Use the appropriate language to display our symbol, + unless the user forced the language to a specific + language. */ + if (language_mode == language_mode_auto) + language = language_def (SYMBOL_LANGUAGE (sym)); else - ui_out_text (uiout, "???"); + language = current_language; + + get_raw_print_options (&opts); + opts.deref_ref = 0; + opts.summary = summary; + common_val_print (val, stb->stream, 2, &opts, language); + ui_out_field_stream (uiout, "value", stb); } if (except.reason < 0) { diff --git a/gdb/valops.c b/gdb/valops.c index 25e0fc3c25f..32d71cdf86f 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1488,7 +1488,6 @@ value_repeat (struct value *arg1, int count) struct value * value_of_variable (struct symbol *var, struct block *b) { - struct value *val; struct frame_info *frame; if (!symbol_read_needs_frame (var)) @@ -1509,11 +1508,7 @@ value_of_variable (struct symbol *var, struct block *b) } } - val = read_var_value (var, frame); - if (!val) - error (_("Address of symbol \"%s\" is unknown."), SYMBOL_PRINT_NAME (var)); - - return val; + return read_var_value (var, frame); } struct value *