This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]