Set optimized_out instead of reporting an error.

This provides a better display when debugging code compiled with
optimization on.

GDB git revision e8395b4efd184f745070afb953f451f99e922be7 (prior to GDB's
switch to GPLv3), modified for the interfaces provided by GDB 6.1.1.

2005-02-28  Daniel Jacobowitz  <dan@codesourcery.com>

 * dwarf2loc.c (loclist_read_variable): Set optimized_out
 instead of reporting an error.
 * valprint.c (value_check_printable): New function.
 (common_val_print): New function.  Use value_check_printable.
 (value_print): Use value_check_printable.
 * value.h (common_val_print): Add prototype.
 * c-valprint.c (c_val_print): Use common_val_print.
 * cp-valprint.c (cp_print_value_fields): Likewise.
 (cp_print_hpacc_virtual_table_entries): Likewise.
 * f-valprint.c (f_val_print): Likewise.
 * jv-valprint.c (java_value_print, java_print_value_fields):
 Likewise.
 * scm-valprint.c (scm_value_print): Likewise.
 * stack.c (print_frame_args): Likewise.
 * varobj.c (c_value_of_variable): Likewise.
 * p-valprint.c (pascal_val_print, pascal_value_print): Likewise.
 (pascal_object_print_value_fields): Likewise.  Update call to
 pascal_object_print_static_field.
 (pascal_object_print_static_field): Remove TYPE argument.  Use
 common_val_print.

Sponsored by:	ADARA Networks
MFC after:	1 month
This commit is contained in:
Ed Maste 2012-11-13 01:21:17 +00:00
parent 04f9c8ff32
commit b4b74d6100
11 changed files with 96 additions and 78 deletions

View File

@ -232,9 +232,8 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
wtype = TYPE_TARGET_TYPE (type);
}
vt_val = value_at (wtype, vt_address, NULL);
val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0,
VALUE_ADDRESS (vt_val), stream, format,
deref_ref, recurse + 1, pretty);
common_val_print (vt_val, stream, format,
deref_ref, recurse + 1, pretty);
if (pretty)
{
fprintf_filtered (stream, "\n");
@ -283,15 +282,8 @@ c_val_print (struct type *type, char *valaddr, int embedded_offset,
unpack_pointer (lookup_pointer_type (builtin_type_void),
valaddr + embedded_offset),
NULL);
val_print (VALUE_TYPE (deref_val),
VALUE_CONTENTS (deref_val),
0,
VALUE_ADDRESS (deref_val),
stream,
format,
deref_ref,
recurse,
pretty);
common_val_print (deref_val, stream, format, deref_ref,
recurse, pretty);
}
else
fputs_filtered ("???", stream);

View File

@ -361,8 +361,7 @@ cp_print_value_fields (struct type *type, struct type *real_type, char *valaddr,
(TYPE_FIELD_TYPE (type, i),
unpack_field_as_long (type, valaddr + offset, i));
val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v),
0, 0, stream, format, 0, recurse + 1, pretty);
common_val_print (v, stream, format, 0, recurse + 1, pretty);
}
}
else
@ -426,8 +425,7 @@ cp_print_value_fields (struct type *type, struct type *real_type, char *valaddr,
v = value_from_pointer (lookup_pointer_type (builtin_type_unsigned_long),
*(unsigned long *) (valaddr + offset));
val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
stream, format, 0, recurse + 1, pretty);
common_val_print (v, stream, format, 0, recurse + 1, pretty);
fields_seen = 1;
if (vtblprint)
@ -791,8 +789,7 @@ cp_print_hpacc_virtual_table_entries (struct type *type, int *vfuncs,
VALUE_TYPE (vf) = VALUE_TYPE (v); /* make it a pointer */
/* print out the entry */
val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
stream, format, 0, recurse + 1, pretty);
common_val_print (vf, stream, format, 0, recurse + 1, pretty);
field_physname
= TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi);
/* pai: (temp) FIXME Maybe this should be DMGL_ANSI */

View File

@ -492,9 +492,14 @@ loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
data = find_location_expression (dlbaton, &size,
frame ? get_frame_pc (frame) : 0);
if (data == NULL)
error ("Variable \"%s\" is not available.", SYMBOL_NATURAL_NAME (symbol));
val = dwarf2_evaluate_loc_desc (symbol, frame, data, size, dlbaton->objfile);
{
val = allocate_value (SYMBOL_TYPE (symbol));
VALUE_LVAL (val) = not_lval;
VALUE_OPTIMIZED_OUT (val) = 1;
}
else
val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
dlbaton->objfile);
return val;
}

View File

@ -444,15 +444,8 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
unpack_pointer (lookup_pointer_type (builtin_type_void),
valaddr + embedded_offset),
NULL);
val_print (VALUE_TYPE (deref_val),
VALUE_CONTENTS (deref_val),
0,
VALUE_ADDRESS (deref_val),
stream,
format,
deref_ref,
recurse,
pretty);
common_val_print (deref_val, stream, format, deref_ref, recurse,
pretty);
}
else
fputs_filtered ("???", stream);

View File

@ -189,8 +189,7 @@ java_value_print (struct value *val, struct ui_file *stream, int format,
else
fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
stream, format, 2, 1, pretty);
common_val_print (v, stream, format, 2, 1, pretty);
things_printed++;
i += reps;
@ -242,8 +241,7 @@ java_value_print (struct value *val, struct ui_file *stream, int format,
return 0;
}
return (val_print (type, VALUE_CONTENTS (val), 0, address,
stream, format, 1, 0, pretty));
return common_val_print (val, stream, format, 1, 0, pretty);
}
/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
@ -391,8 +389,7 @@ java_print_value_fields (struct type *type, char *valaddr, CORE_ADDR address,
v = value_from_longest (TYPE_FIELD_TYPE (type, i),
unpack_field_as_long (type, valaddr, i));
val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
0, stream, format, 0, recurse + 1, pretty);
common_val_print (v, stream, format, 0, recurse + 1, pretty);
}
}
else
@ -411,9 +408,8 @@ java_print_value_fields (struct type *type, char *valaddr, CORE_ADDR address,
struct type *t = check_typedef (VALUE_TYPE (v));
if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
v = value_addr (v);
val_print (VALUE_TYPE (v),
VALUE_CONTENTS (v), 0, VALUE_ADDRESS (v),
stream, format, 0, recurse + 1, pretty);
common_val_print (v, stream, format, 0, recurse + 1,
pretty);
}
}
else if (TYPE_FIELD_TYPE (type, i) == NULL)

View File

@ -238,9 +238,8 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
wtype = TYPE_TARGET_TYPE (type);
}
vt_val = value_at (wtype, vt_address, NULL);
val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0,
VALUE_ADDRESS (vt_val), stream, format,
deref_ref, recurse + 1, pretty);
common_val_print (vt_val, stream, format, deref_ref,
recurse + 1, pretty);
if (pretty)
{
fprintf_filtered (stream, "\n");
@ -291,10 +290,8 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
unpack_pointer (lookup_pointer_type (builtin_type_void),
valaddr + embedded_offset),
NULL);
val_print (VALUE_TYPE (deref_val),
VALUE_CONTENTS (deref_val), 0,
VALUE_ADDRESS (deref_val), stream, format,
deref_ref, recurse + 1, pretty);
common_val_print (deref_val, stream, format, deref_ref,
recurse + 1, pretty);
}
else
fputs_filtered ("???", stream);
@ -565,9 +562,7 @@ pascal_value_print (struct value *val, struct ui_file *stream, int format,
fprintf_filtered (stream, ") ");
}
}
return val_print (type, VALUE_CONTENTS (val), VALUE_EMBEDDED_OFFSET (val),
VALUE_ADDRESS (val) + VALUE_OFFSET (val),
stream, format, 1, 0, pretty);
return common_val_print (val, stream, format, 1, 0, pretty);
}
@ -583,7 +578,7 @@ static int pascal_static_field_print; /* Controls printing of static fields. */
static struct obstack dont_print_vb_obstack;
static struct obstack dont_print_statmem_obstack;
static void pascal_object_print_static_field (struct type *, struct value *,
static void pascal_object_print_static_field (struct value *,
struct ui_file *, int, int,
enum val_prettyprint);
@ -844,8 +839,7 @@ pascal_object_print_value_fields (struct type *type, char *valaddr,
v = value_from_longest (TYPE_FIELD_TYPE (type, i),
unpack_field_as_long (type, valaddr, i));
val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
stream, format, 0, recurse + 1, pretty);
common_val_print (v, stream, format, 0, recurse + 1, pretty);
}
}
else
@ -864,9 +858,8 @@ pascal_object_print_value_fields (struct type *type, char *valaddr,
if (v == NULL)
fputs_filtered ("<optimized out>", stream);
else
pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v,
stream, format, recurse + 1,
pretty);
pascal_object_print_static_field (v, stream, format,
recurse + 1, pretty);
}
else
{
@ -1005,14 +998,16 @@ pascal_object_print_value (struct type *type, char *valaddr, CORE_ADDR address,
static member classes in an obstack and refuse to print them more
than once.
VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
VAL contains the value to print, STREAM, RECURSE, and PRETTY
have the same meanings as in c_val_print. */
static void
pascal_object_print_static_field (struct type *type, struct value *val,
pascal_object_print_static_field (struct value *val,
struct ui_file *stream, int format,
int recurse, enum val_prettyprint pretty)
{
struct type *type = VALUE_TYPE (val);
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
CORE_ADDR *first_dont_print;
@ -1041,8 +1036,7 @@ pascal_object_print_static_field (struct type *type, struct value *val,
stream, format, recurse, pretty, NULL, 1);
return;
}
val_print (type, VALUE_CONTENTS (val), 0, VALUE_ADDRESS (val),
stream, format, 0, recurse, pretty);
common_val_print (val, stream, format, 0, recurse, pretty);
}
void

View File

@ -390,6 +390,5 @@ int
scm_value_print (struct value *val, struct ui_file *stream, int format,
enum val_prettyprint pretty)
{
return (val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
return (common_val_print (val, stream, format, 1, 0, pretty));
}

View File

@ -354,9 +354,7 @@ print_frame_args (struct symbol *func, struct frame_info *fi, int num,
if (val)
{
val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
VALUE_ADDRESS (val),
stb->stream, 0, 0, 2, Val_no_prettyprint);
common_val_print (val, stb->stream, 0, 0, 2, Val_no_prettyprint);
ui_out_field_stream (uiout, "value", stb);
}
else

View File

@ -150,6 +150,54 @@ val_print (struct type *type, char *valaddr, int embedded_offset,
stream, format, deref_ref, recurse, pretty));
}
/* Check whether the value VAL is printable. Return 1 if it is;
return 0 and print an appropriate error message to STREAM if it
is not. */
static int
value_check_printable (struct value *val, struct ui_file *stream)
{
if (val == 0)
{
fprintf_filtered (stream, "<address of value unknown>");
return 0;
}
if (VALUE_OPTIMIZED_OUT (val))
{
fprintf_filtered (stream, "<value optimized out>");
return 0;
}
return 1;
}
/* Print the value VAL onto stream STREAM according to FORMAT (a
letter, or 0 for natural format using TYPE).
If DEREF_REF is nonzero, then dereference references, otherwise just print
them like pointers.
The PRETTY parameter controls prettyprinting.
If the data are a string pointer, returns the number of string characters
printed.
This is a preferable interface to val_print, above, because it uses
GDB's value mechanism. */
int
common_val_print (struct value *val, struct ui_file *stream, int format,
int deref_ref, int recurse, enum val_prettyprint pretty)
{
if (!value_check_printable (val, stream))
return 0;
return val_print (VALUE_TYPE(val), VALUE_CONTENTS_ALL (val),
VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
stream, format, deref_ref, recurse, pretty);
}
/* Print the value VAL in C-ish syntax on stream STREAM.
FORMAT is a format-letter, or 0 for print in natural format of data type.
If the object printed is a string pointer, returns
@ -159,16 +207,9 @@ int
value_print (struct value *val, struct ui_file *stream, int format,
enum val_prettyprint pretty)
{
if (val == 0)
{
printf_filtered ("<address of value unknown>");
return 0;
}
if (VALUE_OPTIMIZED_OUT (val))
{
printf_filtered ("<value optimized out>");
return 0;
}
if (!value_check_printable (val, stream))
return 0;
return LA_VALUE_PRINT (val, stream, format, pretty);
}

View File

@ -523,6 +523,11 @@ extern int val_print (struct type * type, char *valaddr,
int deref_ref, int recurse,
enum val_prettyprint pretty);
extern int common_val_print (struct value *val,
struct ui_file *stream, int format,
int deref_ref, int recurse,
enum val_prettyprint pretty);
extern int val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream);
extern void print_variable_value (struct symbol * var,

View File

@ -2093,10 +2093,8 @@ c_value_of_variable (struct varobj *var)
if (VALUE_LAZY (var->value))
gdb_value_fetch_lazy (var->value);
val_print (VALUE_TYPE (var->value),
VALUE_CONTENTS_RAW (var->value), 0,
VALUE_ADDRESS (var->value), stb,
format_code[(int) var->format], 1, 0, 0);
common_val_print (var->value, stb,
format_code[(int) var->format], 1, 0, 0);
thevalue = ui_file_xstrdup (stb, &dummy);
do_cleanups (old_chain);
return thevalue;