This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch 2/2] Code cleanup(+fix): read_var_value never returns NULL
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 31 Aug 2011 17:58:31 +0200
- Subject: [patch 2/2] Code cleanup(+fix): read_var_value never returns NULL
Hi,
obvious dependency on [patch 1/2].
read_var_value currently during various kinds of error could either return
NULL or to throw an exception. In the NULL case there was even no explanation
to the user.
There were some cases (value_struct_elt_for_reference,
insert_exception_resume_breakpoint) where the NULL was not checked and GDB
could crash.
Simplify + improve user error messages reporting by just always throwing
errors. Handling all the cases of NULLs and different kinds errors for
comparisons of normal values vs. entry values got too messy in entryval.
No regressions on {x86_64,x86_64-m32,i686}-fedora16pre-linux-gnu.
I will check in all the 3 patches together soon, it is entryval pre-requisite.
Thanks,
Jan
gdb/
2011-08-31 Jan Kratochvil <jan.kratochvil@redhat.com>
* 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.
--- 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;
}
--- 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);
}
--- 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)
{
--- 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 *