PR gdb/9977, PR exp/11636:
	* value.h (value_offset): Update.
	(struct lval_funcs) <check_validity>: New field.
	<copy_closure>: Make argument const.
	(value_computed_closure): Update.
	(value_contents_for_printing): Declare.
	(value_bits_valid): Likewise.
	(val_print): Likewise.
	(set_value_component_location): Update.
	(value_entirely_optimized_out): Declare.
	* value.c (value_offset): Argument now const.
	(require_not_optimized_out): New function.
	(value_contents_for_printing): New function.
	(value_contents_all): Call require_not_optimized_out.
	(value_contents): Likewise.
	(value_bits_valid): New function.
	(value_computed_closure): Argument now const.
	(set_value_component_location): Make 'whole' argument const.
	(value_entirely_optimized_out): New function.
	(value_bitsize): Argument now 'const'.
	(value_bitpos): Likewise.
	(value_type): Likewise.
	* valprint.h (val_print_array_elements): Update.
	* valprint.c (val_print): Add 'val' argument.  Use
	valprint_check_validity.
	(valprint_check_validity): New function.
	(value_check_printable): Use value_entirely_optimized_out.
	(common_val_print): Update.
	(value_print): Likewise.
	(val_print_array_elements): Add 'val' argument.
	* valops.c (value_fetch_lazy): Use value_contents_for_printing,
	value_bits_valid.  Reinit frame cache for lval_computed.
	* sh64-tdep.c (sh64_do_register): Update.
	* scm-valprint.c (scm_val_print): Add 'val' argument.
	* scm-lang.h (scm_val_print): Update.
	* python/python.h (apply_val_pretty_printer): Update.
	* python/py-prettyprint.c (apply_val_pretty_printer): Add 'val'
	argument.  Call set_value_component_location.
	* printcmd.c (print_scalar_formatted): Update.
	* p-valprint.c (pascal_val_print): Add 'val' argument.
	(pascal_object_print_value_fields): Likewise.
	(pascal_object_print_value): Likewise.
	(pascal_object_print_static_field): Update.
	* p-lang.h (pascal_val_print): Update.
	(pascal_object_print_value_fields): Update.
	* mt-tdep.c (mt_registers_info): Update.
	* mi/mi-main.c (get_register): Update.
	(mi_cmd_data_evaluate_expression): Use common_val_print.
	* m2-valprint.c (m2_print_array_contents): Add 'val' argument.
	(m2_print_unbounded_array): Likewise.
	(m2_val_print): Likewise.
	* m2-lang.h (m2_val_print): Update.
	* language.h (struct language_defn) <la_val_print>: Add 'val'
	argument.
	(LA_VAL_PRINT): Likewise.
	* language.c (unk_lang_val_print): Add 'val' argument.
	* jv-valprint.c (java_print_value_fields): Add 'val' argument.
	(java_val_print): Likewise.
	* jv-lang.h (java_val_print): Add 'val' argument.
	* infcmd.c (default_print_registers_info): Update.
	* f-valprint.c (f77_print_array_1): Add 'val' argument.
	(f77_print_array): Likewise.
	(f_val_print): Likewise.
	* f-lang.h (f_val_print): Add 'val' argument.
	* dwarf2loc.c (read_pieced_value): Use value_bitsize and
	value_bitpos.
	<DWARF_VALUE_OPTIMIZED_OUT>: Don't print warning.  Call
	set_value_optimized_out.
	(write_pieced_value): Use value_bitsize and value_bitpos.
	<default>: Don't exit loop.
	(check_pieced_value_validity): New function.
	(pieced_value_funcs): Reference check_pieced_value_validity,
	check_pieced_value_invalid.
	(copy_pieced_value_closure): Update.
	(check_pieced_value_bits): New function.
	(check_pieced_value_invalid): New function.
	* d-valprint.c (dynamic_array_type): Add 'val' argument.
	(d_val_print): Likewise.
	* d-lang.h (d_val_print): Update.
	* cp-valprint.c (cp_print_value_fields): Add 'val' argument.
	(cp_print_value_fields_rtti): Likewise.
	(cp_print_value): Likewise.
	(cp_print_static_field): Update.
	* c-valprint.c (c_val_print): Add 'val' argument.
	(c_value_print): Update.
	* c-lang.h (c_val_print): Update.
	(cp_print_value_fields): Likewise.
	(cp_print_value_fields_rtti): Likewise.
	* ada-valprint.c (struct ada_val_print_args): Remove.
	(val_print_packed_array_elements): Add 'val' argument.
	(ada_val_print): Likewise.  Rewrite.
	(ada_val_print_stub): Remove.
	(ada_val_print_array): Add 'val' argument.
	(ada_val_print_1): Likewise.
	(print_variant_part): Likewise.
	(ada_value_print): Update.
	(print_record): Add 'val' argument.
	(print_field_values): Likewise.
	* ada-lang.h (ada_val_print): Update.
gdb/testsuite
	PR gdb/9977, PR exp/11636::
	* gdb.dwarf2/pieces.exp (pieces_test_f3): Remove kfail.
	(pieces_test_f6): Update expected output.
This commit is contained in:
Tom Tromey 2010-06-11 15:36:10 +00:00
parent f654f403d3
commit 0e03807e1c
35 changed files with 538 additions and 174 deletions

View File

@ -1,3 +1,105 @@
2010-06-11 Tom Tromey <tromey@redhat.com>
PR gdb/9977, PR exp/11636:
* value.h (value_offset): Update.
(struct lval_funcs) <check_validity>: New field.
<copy_closure>: Make argument const.
(value_computed_closure): Update.
(value_contents_for_printing): Declare.
(value_bits_valid): Likewise.
(val_print): Likewise.
(set_value_component_location): Update.
(value_entirely_optimized_out): Declare.
* value.c (value_offset): Argument now const.
(require_not_optimized_out): New function.
(value_contents_for_printing): New function.
(value_contents_all): Call require_not_optimized_out.
(value_contents): Likewise.
(value_bits_valid): New function.
(value_computed_closure): Argument now const.
(set_value_component_location): Make 'whole' argument const.
(value_entirely_optimized_out): New function.
(value_bitsize): Argument now 'const'.
(value_bitpos): Likewise.
(value_type): Likewise.
* valprint.h (val_print_array_elements): Update.
* valprint.c (val_print): Add 'val' argument. Use
valprint_check_validity.
(valprint_check_validity): New function.
(value_check_printable): Use value_entirely_optimized_out.
(common_val_print): Update.
(value_print): Likewise.
(val_print_array_elements): Add 'val' argument.
* valops.c (value_fetch_lazy): Use value_contents_for_printing,
value_bits_valid. Reinit frame cache for lval_computed.
* sh64-tdep.c (sh64_do_register): Update.
* scm-valprint.c (scm_val_print): Add 'val' argument.
* scm-lang.h (scm_val_print): Update.
* python/python.h (apply_val_pretty_printer): Update.
* python/py-prettyprint.c (apply_val_pretty_printer): Add 'val'
argument. Call set_value_component_location.
* printcmd.c (print_scalar_formatted): Update.
* p-valprint.c (pascal_val_print): Add 'val' argument.
(pascal_object_print_value_fields): Likewise.
(pascal_object_print_value): Likewise.
(pascal_object_print_static_field): Update.
* p-lang.h (pascal_val_print): Update.
(pascal_object_print_value_fields): Update.
* mt-tdep.c (mt_registers_info): Update.
* mi/mi-main.c (get_register): Update.
(mi_cmd_data_evaluate_expression): Use common_val_print.
* m2-valprint.c (m2_print_array_contents): Add 'val' argument.
(m2_print_unbounded_array): Likewise.
(m2_val_print): Likewise.
* m2-lang.h (m2_val_print): Update.
* language.h (struct language_defn) <la_val_print>: Add 'val'
argument.
(LA_VAL_PRINT): Likewise.
* language.c (unk_lang_val_print): Add 'val' argument.
* jv-valprint.c (java_print_value_fields): Add 'val' argument.
(java_val_print): Likewise.
* jv-lang.h (java_val_print): Add 'val' argument.
* infcmd.c (default_print_registers_info): Update.
* f-valprint.c (f77_print_array_1): Add 'val' argument.
(f77_print_array): Likewise.
(f_val_print): Likewise.
* f-lang.h (f_val_print): Add 'val' argument.
* dwarf2loc.c (read_pieced_value): Use value_bitsize and
value_bitpos.
<DWARF_VALUE_OPTIMIZED_OUT>: Don't print warning. Call
set_value_optimized_out.
(write_pieced_value): Use value_bitsize and value_bitpos.
<default>: Don't exit loop.
(check_pieced_value_validity): New function.
(pieced_value_funcs): Reference check_pieced_value_validity,
check_pieced_value_invalid.
(copy_pieced_value_closure): Update.
(check_pieced_value_bits): New function.
(check_pieced_value_invalid): New function.
* d-valprint.c (dynamic_array_type): Add 'val' argument.
(d_val_print): Likewise.
* d-lang.h (d_val_print): Update.
* cp-valprint.c (cp_print_value_fields): Add 'val' argument.
(cp_print_value_fields_rtti): Likewise.
(cp_print_value): Likewise.
(cp_print_static_field): Update.
* c-valprint.c (c_val_print): Add 'val' argument.
(c_value_print): Update.
* c-lang.h (c_val_print): Update.
(cp_print_value_fields): Likewise.
(cp_print_value_fields_rtti): Likewise.
* ada-valprint.c (struct ada_val_print_args): Remove.
(val_print_packed_array_elements): Add 'val' argument.
(ada_val_print): Likewise. Rewrite.
(ada_val_print_stub): Remove.
(ada_val_print_array): Add 'val' argument.
(ada_val_print_1): Likewise.
(print_variant_part): Likewise.
(ada_value_print): Update.
(print_record): Add 'val' argument.
(print_field_values): Likewise.
* ada-lang.h (ada_val_print): Update.
2010-06-11 Tom Tromey <tromey@redhat.com>
* vec.h (VEC_cleanup): New macro.

View File

@ -164,6 +164,7 @@ extern void ada_print_typedef (struct type *type, struct symbol *new_symbol,
extern int ada_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern int ada_value_print (struct value *, struct ui_file *,

View File

@ -36,33 +36,23 @@
#include "exceptions.h"
#include "objfiles.h"
/* Encapsulates arguments to ada_val_print. */
struct ada_val_print_args
{
struct type *type;
const gdb_byte *valaddr0;
int embedded_offset;
CORE_ADDR address;
struct ui_file *stream;
int recurse;
const struct value_print_options *options;
};
static void print_record (struct type *, const gdb_byte *, struct ui_file *,
int, const struct value_print_options *);
int,
const struct value *,
const struct value_print_options *);
static int print_field_values (struct type *, const gdb_byte *,
struct ui_file *, int,
const struct value *,
const struct value_print_options *,
int, struct type *,
const gdb_byte *);
static void adjust_type_signedness (struct type *);
static int ada_val_print_stub (void *args0);
static int ada_val_print_1 (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
@ -146,6 +136,7 @@ static void
val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
int bitoffset, struct ui_file *stream,
int recurse,
const struct value *val,
const struct value_print_options *options)
{
unsigned int i;
@ -217,7 +208,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
opts.deref_ref = 0;
val_print (elttype, value_contents (v0), 0, 0, stream,
recurse + 1, &opts, current_language);
recurse + 1, val, &opts, current_language);
annotate_elt_rep (i - i0);
fprintf_filtered (stream, _(" <repeats %u times>"), i - i0);
annotate_elt_rep_end ();
@ -247,7 +238,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
stream, options);
}
val_print (elttype, value_contents (v0), 0, 0, stream,
recurse + 1, &opts, current_language);
recurse + 1, val, &opts, current_language);
annotate_elt ();
}
}
@ -581,30 +572,22 @@ int
ada_val_print (struct type *type, const gdb_byte *valaddr0,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
struct ada_val_print_args args;
args.type = type;
args.valaddr0 = valaddr0;
args.embedded_offset = embedded_offset;
args.address = address;
args.stream = stream;
args.recurse = recurse;
args.options = options;
volatile struct gdb_exception except;
int result = 0;
return catch_errors (ada_val_print_stub, &args, NULL, RETURN_MASK_ALL);
}
TRY_CATCH (except, RETURN_MASK_ALL)
{
result = ada_val_print_1 (type, valaddr0, embedded_offset, address,
stream, recurse, val, options);
}
/* Helper for ada_val_print; used as argument to catch_errors to
unmarshal the arguments to ada_val_print_1, which does the work. */
static int
ada_val_print_stub (void *args0)
{
struct ada_val_print_args *argsp = (struct ada_val_print_args *) args0;
if (except.reason < 0)
result = 0;
return ada_val_print_1 (argsp->type, argsp->valaddr0,
argsp->embedded_offset, argsp->address,
argsp->stream, argsp->recurse, argsp->options);
return result;
}
/* Assuming TYPE is a simple array, print the value of this array located
@ -615,6 +598,7 @@ ada_val_print_stub (void *args0)
static int
ada_val_print_array (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
@ -663,10 +647,10 @@ ada_val_print_array (struct type *type, const gdb_byte *valaddr,
print_optional_low_bound (stream, type, options);
if (TYPE_FIELD_BITSIZE (type, 0) > 0)
val_print_packed_array_elements (type, valaddr, 0, stream,
recurse, options);
recurse, val, options);
else
val_print_array_elements (type, valaddr, address, stream,
recurse, options, 0);
recurse, val, options, 0);
fprintf_filtered (stream, ")");
}
@ -680,6 +664,7 @@ static int
ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *original_value,
const struct value_print_options *options)
{
unsigned int len;
@ -706,7 +691,8 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
}
else
retn = ada_val_print_1 (value_type (val), value_contents (val), 0,
value_address (val), stream, recurse, options);
value_address (val), stream, recurse,
NULL, options);
value_free_to_mark (mark);
return retn;
}
@ -719,12 +705,12 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
{
default:
return c_val_print (type, valaddr0, embedded_offset, address, stream,
recurse, options);
recurse, original_value, options);
case TYPE_CODE_PTR:
{
int ret = c_val_print (type, valaddr0, embedded_offset, address,
stream, recurse, options);
stream, recurse, original_value, options);
if (ada_is_tag_type (type))
{
@ -765,12 +751,12 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
(type, valaddr, 0));
return ada_val_print_1 (target_type, value_contents (v), 0, 0,
stream, recurse + 1, options);
stream, recurse + 1, NULL, options);
}
else
return ada_val_print_1 (TYPE_TARGET_TYPE (type),
valaddr0, embedded_offset,
address, stream, recurse, options);
address, stream, recurse, original_value, options);
}
else
{
@ -855,7 +841,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
case TYPE_CODE_FLT:
if (options->format)
return c_val_print (type, valaddr0, embedded_offset, address, stream,
recurse, options);
recurse, original_value, options);
else
ada_print_floating (valaddr0 + embedded_offset, type, stream);
break;
@ -869,13 +855,14 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
}
else
{
print_record (type, valaddr, stream, recurse, options);
print_record (type, valaddr, stream, recurse, original_value,
options);
return 0;
}
case TYPE_CODE_ARRAY:
return ada_val_print_array (type, valaddr, address, stream,
recurse, options);
recurse, original_value, options);
case TYPE_CODE_REF:
/* For references, the debugger is expected to print the value as
@ -899,7 +886,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
val_print (value_type (deref_val),
value_contents (deref_val), 0,
value_address (deref_val), stream, recurse + 1,
options, current_language);
original_value, options, current_language);
}
else
fputs_filtered ("(null)", stream);
@ -916,6 +903,7 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
static int
print_variant_part (struct type *type, int field_num, const gdb_byte *valaddr,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options, int comma_needed,
struct type *outer_type, const gdb_byte *outer_valaddr)
{
@ -929,7 +917,7 @@ print_variant_part (struct type *type, int field_num, const gdb_byte *valaddr,
(TYPE_FIELD_TYPE (var_type, which),
valaddr + TYPE_FIELD_BITPOS (type, field_num) / HOST_CHAR_BIT
+ TYPE_FIELD_BITPOS (var_type, which) / HOST_CHAR_BIT,
stream, recurse, options,
stream, recurse, val, options,
comma_needed, outer_type, outer_valaddr);
}
@ -973,19 +961,20 @@ ada_value_print (struct value *val0, struct ui_file *stream,
opts = *options;
opts.deref_ref = 1;
return (val_print (type, value_contents (val), 0, address,
stream, 0, &opts, current_language));
stream, 0, val, &opts, current_language));
}
static void
print_record (struct type *type, const gdb_byte *valaddr,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
type = ada_check_typedef (type);
fprintf_filtered (stream, "(");
if (print_field_values (type, valaddr, stream, recurse, options,
if (print_field_values (type, valaddr, stream, recurse, val, options,
0, type, valaddr) != 0 && options->pretty)
{
fprintf_filtered (stream, "\n");
@ -1012,6 +1001,7 @@ print_record (struct type *type, const gdb_byte *valaddr,
static int
print_field_values (struct type *type, const gdb_byte *valaddr,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
int comma_needed,
struct type *outer_type, const gdb_byte *outer_valaddr)
@ -1031,7 +1021,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
print_field_values (TYPE_FIELD_TYPE (type, i),
valaddr
+ TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
stream, recurse, options,
stream, recurse, val, options,
comma_needed, type, valaddr);
continue;
}
@ -1039,7 +1029,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
{
comma_needed =
print_variant_part (type, i, valaddr,
stream, recurse, options, comma_needed,
stream, recurse, val, options, comma_needed,
outer_type, outer_valaddr);
continue;
}
@ -1106,7 +1096,8 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
opts = *options;
opts.deref_ref = 0;
val_print (TYPE_FIELD_TYPE (type, i), value_contents (v), 0, 0,
stream, recurse + 1, &opts, current_language);
stream, recurse + 1, v,
&opts, current_language);
}
}
else
@ -1116,7 +1107,7 @@ print_field_values (struct type *type, const gdb_byte *valaddr,
opts.deref_ref = 0;
ada_val_print (TYPE_FIELD_TYPE (type, i),
valaddr + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
0, 0, stream, recurse + 1, &opts);
0, 0, stream, recurse + 1, val, &opts);
}
annotate_field_end ();
}

View File

@ -70,6 +70,7 @@ extern void c_print_typedef (struct type *, struct symbol *, struct ui_file *);
extern int c_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern int c_value_print (struct value *, struct ui_file *,
@ -104,12 +105,14 @@ extern void cp_print_class_member (const gdb_byte *, struct type *,
extern void cp_print_value_fields (struct type *, struct type *,
const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *,
struct type **, int);
extern void cp_print_value_fields_rtti (struct type *,
const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *,
struct type **, int);

View File

@ -150,6 +150,7 @@ c_textual_element_type (struct type *type, char format)
int
c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *original_value,
const struct value_print_options *options)
{
struct gdbarch *gdbarch = get_type_arch (type);
@ -177,8 +178,12 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
print_spaces_filtered (2 + 2 * recurse, stream);
}
/* Print arrays of textual chars with a string syntax. */
if (c_textual_element_type (unresolved_elttype, options->format))
/* Print arrays of textual chars with a string syntax, as
long as the entire array is valid. */
if (c_textual_element_type (unresolved_elttype, options->format)
&& value_bits_valid (original_value,
TARGET_CHAR_BIT * embedded_offset,
TARGET_CHAR_BIT * TYPE_LENGTH (type)))
{
/* If requested, look for the first null char and only print
elements up to it. */
@ -217,7 +222,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
i = 0;
}
val_print_array_elements (type, valaddr + embedded_offset, address, stream,
recurse, options, i);
recurse, original_value, options, i);
fprintf_filtered (stream, "}");
}
break;
@ -394,7 +399,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
else
cp_print_value_fields_rtti (type, valaddr,
embedded_offset, address, stream,
recurse, options, NULL, 0);
recurse, original_value, options, NULL, 0);
break;
case TYPE_CODE_ENUM:
@ -695,9 +700,9 @@ c_value_print (struct value *val, struct ui_file *stream,
full ? "" : _(" [incomplete object]"));
/* Print out object: enclosing type is same as real_type if full */
return val_print (value_enclosing_type (val),
value_contents_all (val), 0,
value_contents_for_printing (val), 0,
value_address (val), stream, 0,
&opts, current_language);
val, &opts, current_language);
/* Note: When we look up RTTI entries, we don't get any information on
const or volatile attributes */
}
@ -707,15 +712,16 @@ c_value_print (struct value *val, struct ui_file *stream,
fprintf_filtered (stream, "(%s ?) ",
TYPE_NAME (value_enclosing_type (val)));
return val_print (value_enclosing_type (val),
value_contents_all (val), 0,
value_contents_for_printing (val), 0,
value_address (val), stream, 0,
&opts, current_language);
val, &opts, current_language);
}
/* Otherwise, we end up at the return outside this "if" */
}
return val_print (val_type, value_contents_all (val),
return val_print (val_type, value_contents_for_printing (val),
value_embedded_offset (val),
value_address (val),
stream, 0, &opts, current_language);
stream, 0,
val, &opts, current_language);
}

View File

@ -81,6 +81,7 @@ static void cp_print_static_field (struct type *, struct value *,
static void cp_print_value (struct type *, struct type *, const gdb_byte *,
int, CORE_ADDR, struct ui_file *, int,
const struct value *,
const struct value_print_options *, struct type **);
@ -151,6 +152,7 @@ void
cp_print_value_fields (struct type *type, struct type *real_type,
const gdb_byte *valaddr, int offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
struct type **dont_print_vb, int dont_print_statmem)
{
@ -177,7 +179,7 @@ cp_print_value_fields (struct type *type, struct type *real_type,
if (n_baseclasses > 0)
cp_print_value (type, real_type, valaddr, offset, address, stream,
recurse + 1, options, dont_print_vb);
recurse + 1, val, options, dont_print_vb);
/* Second, print out data fields */
@ -278,6 +280,11 @@ cp_print_value_fields (struct type *type, struct type *real_type,
{
fputs_filtered ("<optimized out or zero length>", stream);
}
else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
TYPE_FIELD_BITSIZE (type, i)))
{
fputs_filtered (_("<value optimized out>"), stream);
}
else
{
struct value_print_options opts = *options;
@ -315,7 +322,7 @@ cp_print_value_fields (struct type *type, struct type *real_type,
val_print (TYPE_FIELD_TYPE (type, i),
valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
address,
stream, recurse + 1, &opts,
stream, recurse + 1, val, &opts,
current_language);
}
}
@ -377,26 +384,35 @@ cp_print_value_fields_rtti (struct type *type,
const gdb_byte *valaddr, int offset,
CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
struct type **dont_print_vb,
int dont_print_statmem)
{
struct value *value;
int full, top, using_enc;
struct type *real_type;
struct type *real_type = NULL;
/* We require all bits to be valid in order to attempt a
conversion. */
if (value_bits_valid (val, TARGET_CHAR_BIT * offset,
TARGET_CHAR_BIT * TYPE_LENGTH (type)))
{
struct value *value;
int full, top, using_enc;
/* Ugh, we have to convert back to a value here. */
value = value_from_contents_and_address (type, valaddr + offset,
address + offset);
/* We don't actually care about most of the result here -- just the
type. We already have the correct offset, due to how val_print
was initially called. */
real_type = value_rtti_type (value, &full, &top, &using_enc);
}
/* Ugh, we have to convert back to a value here. */
value = value_from_contents_and_address (type, valaddr + offset,
address + offset);
/* We don't actually care about most of the result here -- just the
type. We already have the correct offset, due to how val_print
was initially called. */
real_type = value_rtti_type (value, &full, &top, &using_enc);
if (!real_type)
real_type = type;
cp_print_value_fields (type, real_type, valaddr, offset,
address, stream, recurse, options,
address, stream, recurse, val, options,
dont_print_vb, dont_print_statmem);
}
@ -407,6 +423,7 @@ static void
cp_print_value (struct type *type, struct type *real_type,
const gdb_byte *valaddr, int offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
struct type **dont_print_vb)
{
@ -508,14 +525,14 @@ cp_print_value (struct type *type, struct type *real_type,
result = apply_val_pretty_printer (baseclass, base_valaddr,
thisoffset + boffset,
address,
stream, recurse,
stream, recurse, val,
options,
current_language);
if (!result)
cp_print_value_fields (baseclass, thistype, base_valaddr,
thisoffset + boffset, address,
stream, recurse, options,
stream, recurse, val, options,
((struct type **)
obstack_base (&dont_print_vb_obstack)),
0);
@ -582,9 +599,10 @@ cp_print_static_field (struct type *type,
sizeof (CORE_ADDR));
CHECK_TYPEDEF (type);
cp_print_value_fields (type, value_enclosing_type (val),
value_contents_all (val),
value_contents_for_printing (val),
value_embedded_offset (val), addr,
stream, recurse, options, NULL, 1);
stream, recurse,
val, options, NULL, 1);
return;
}
@ -616,9 +634,10 @@ cp_print_static_field (struct type *type,
opts = *options;
opts.deref_ref = 0;
val_print (type, value_contents_all (val),
val_print (type, value_contents_for_printing (val),
value_embedded_offset (val), value_address (val),
stream, recurse, &opts, current_language);
stream, recurse,
val, &opts, current_language);
}

View File

@ -27,6 +27,7 @@ extern char *d_demangle (const char *mangled, int options);
extern int d_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options);
#endif /* !defined (D_LANG_H) */

View File

@ -31,12 +31,15 @@ static int
dynamic_array_type (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
if (TYPE_NFIELDS (type) == 2
&& TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_INT
&& strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
&& strcmp (TYPE_FIELD_NAME (type, 1), "ptr") == 0)
&& strcmp (TYPE_FIELD_NAME (type, 1), "ptr") == 0
&& value_bits_valid (val, TARGET_CHAR_BIT * embedded_offset,
TARGET_CHAR_BIT * TYPE_LENGTH (type)))
{
CORE_ADDR addr;
struct type *elttype;
@ -60,7 +63,7 @@ dynamic_array_type (struct type *type, const gdb_byte *valaddr,
ptraddr = value_contents (val);
return d_val_print (true_type, ptraddr, 0, addr, stream, recurse + 1,
options);
NULL, options);
}
return -1;
}
@ -69,6 +72,7 @@ dynamic_array_type (struct type *type, const gdb_byte *valaddr,
int
d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
int ret;
@ -78,12 +82,12 @@ d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
{
case TYPE_CODE_STRUCT:
ret = dynamic_array_type (type, valaddr, embedded_offset, address,
stream, recurse, options);
stream, recurse, val, options);
if (ret != -1)
break;
default:
ret = c_val_print (type, valaddr, embedded_offset, address, stream,
recurse, options);
recurse, val, options);
}
return ret;

View File

@ -490,7 +490,13 @@ read_pieced_value (struct value *v)
contents = value_contents_raw (v);
bits_to_skip = 8 * value_offset (v);
type_len = 8 * TYPE_LENGTH (value_type (v));
if (value_bitsize (v))
{
bits_to_skip += value_bitpos (v);
type_len = value_bitsize (v);
}
else
type_len = 8 * TYPE_LENGTH (value_type (v));
for (i = 0; i < c->n_pieces && offset < type_len; i++)
{
@ -614,13 +620,7 @@ read_pieced_value (struct value *v)
break;
case DWARF_VALUE_OPTIMIZED_OUT:
/* We just leave the bits empty for now. This is not ideal
but gdb currently does not have a nice way to represent
optimized-out pieces. */
warning (_("bits %ld-%ld in computed object were optimized out; "
"replacing with zeroes"),
offset,
offset + (long) this_size_bits);
set_value_optimized_out (v, 1);
break;
default:
@ -664,7 +664,14 @@ write_pieced_value (struct value *to, struct value *from)
contents = value_contents (from);
bits_to_skip = 8 * value_offset (to);
type_len = 8 * TYPE_LENGTH (value_type (to));
if (value_bitsize (to))
{
bits_to_skip += value_bitpos (to);
type_len = value_bitsize (to);
}
else
type_len = 8 * TYPE_LENGTH (value_type (to));
for (i = 0; i < c->n_pieces && offset < type_len; i++)
{
struct dwarf_expr_piece *p = &c->pieces[i];
@ -767,17 +774,76 @@ write_pieced_value (struct value *to, struct value *from)
break;
default:
set_value_optimized_out (to, 1);
goto done;
break;
}
offset += this_size_bits;
}
done:
do_cleanups (cleanup);
}
static int
check_pieced_value_bits (const struct value *value, int bit_offset,
int bit_length, int validity)
{
struct piece_closure *c
= (struct piece_closure *) value_computed_closure (value);
int i;
bit_offset += 8 * value_offset (value);
if (value_bitsize (value))
bit_offset += value_bitpos (value);
for (i = 0; i < c->n_pieces && bit_length > 0; i++)
{
struct dwarf_expr_piece *p = &c->pieces[i];
size_t this_size_bits = p->size;
if (bit_offset > 0)
{
if (bit_offset >= this_size_bits)
{
bit_offset -= this_size_bits;
continue;
}
bit_length -= this_size_bits - bit_offset;
bit_offset = 0;
}
else
bit_length -= this_size_bits;
if (p->location == DWARF_VALUE_OPTIMIZED_OUT)
{
if (validity)
return 0;
}
else
{
if (!validity)
return 1;
}
}
return validity;
}
static int
check_pieced_value_validity (const struct value *value, int bit_offset,
int bit_length)
{
return check_pieced_value_bits (value, bit_offset, bit_length, 1);
}
static int
check_pieced_value_invalid (const struct value *value)
{
return check_pieced_value_bits (value, 0,
8 * TYPE_LENGTH (value_type (value)), 0);
}
static void *
copy_pieced_value_closure (struct value *v)
copy_pieced_value_closure (const struct value *v)
{
struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
@ -802,6 +868,8 @@ free_pieced_value_closure (struct value *v)
static struct lval_funcs pieced_value_funcs = {
read_pieced_value,
write_pieced_value,
check_pieced_value_validity,
check_pieced_value_invalid,
copy_pieced_value_closure,
free_pieced_value_closure
};

View File

@ -30,6 +30,7 @@ extern void f_print_type (struct type *, char *, struct ui_file *, int,
extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
/* Language-specific data structures */

View File

@ -164,6 +164,7 @@ static void
f77_print_array_1 (int nss, int ndimensions, struct type *type,
const gdb_byte *valaddr, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
int *elts)
{
@ -177,7 +178,7 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type,
f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type),
valaddr + i * F77_DIM_OFFSET (nss),
address + i * F77_DIM_OFFSET (nss),
stream, recurse, options, elts);
stream, recurse, val, options, elts);
fprintf_filtered (stream, ") ");
}
if (*elts >= options->print_max && i < F77_DIM_SIZE (nss))
@ -192,7 +193,7 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type,
valaddr + i * F77_DIM_OFFSET (ndimensions),
0,
address + i * F77_DIM_OFFSET (ndimensions),
stream, recurse, options, current_language);
stream, recurse, val, options, current_language);
if (i != (F77_DIM_SIZE (nss) - 1))
fprintf_filtered (stream, ", ");
@ -210,7 +211,9 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type,
static void
f77_print_array (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream,
int recurse, const struct value_print_options *options)
int recurse,
const struct value *val,
const struct value_print_options *options)
{
int ndimensions;
int elts = 0;
@ -228,7 +231,7 @@ f77_print_array (struct type *type, const gdb_byte *valaddr,
f77_create_arrayprint_offset_tbl (type, stream);
f77_print_array_1 (1, ndimensions, type, valaddr, address, stream,
recurse, options, &elts);
recurse, val, options, &elts);
}
@ -242,6 +245,7 @@ f77_print_array (struct type *type, const gdb_byte *valaddr,
int
f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *original_value,
const struct value_print_options *options)
{
struct gdbarch *gdbarch = get_type_arch (type);
@ -263,7 +267,7 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
case TYPE_CODE_ARRAY:
fprintf_filtered (stream, "(");
f77_print_array (type, valaddr, address, stream, recurse, options);
f77_print_array (type, valaddr, address, stream, recurse, original_value, options);
fprintf_filtered (stream, ")");
break;
@ -424,7 +428,8 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
{
/* Bash the type code temporarily. */
TYPE_CODE (type) = TYPE_CODE_INT;
f_val_print (type, valaddr, 0, address, stream, recurse, options);
val_print (type, valaddr, 0, address, stream, recurse,
original_value, options, current_language);
/* Restore the type code so later uses work as intended. */
TYPE_CODE (type) = TYPE_CODE_BOOL;
}
@ -456,8 +461,9 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
{
int offset = TYPE_FIELD_BITPOS (type, index) / 8;
f_val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset,
embedded_offset, address, stream, recurse, options);
val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset,
embedded_offset, address, stream, recurse + 1,
original_value, options, current_language);
if (index != TYPE_NFIELDS (type) - 1)
fputs_filtered (", ", stream);
}

View File

@ -1957,7 +1957,7 @@ default_print_registers_info (struct gdbarch *gdbarch,
get_user_print_options (&opts);
opts.deref_ref = 1;
val_print (register_type (gdbarch, i), buffer, 0, 0,
file, 0, &opts, current_language);
file, 0, NULL, &opts, current_language);
fprintf_filtered (file, "\t(raw 0x");
for (j = 0; j < register_size (gdbarch, i); j++)
@ -1980,8 +1980,7 @@ default_print_registers_info (struct gdbarch *gdbarch,
get_formatted_print_options (&opts, 'x');
opts.deref_ref = 1;
val_print (register_type (gdbarch, i), buffer, 0, 0,
file, 0, &opts,
current_language);
file, 0, NULL, &opts, current_language);
/* If not a vector register, print it also according to its
natural format. */
if (TYPE_VECTOR (register_type (gdbarch, i)) == 0)
@ -1990,7 +1989,7 @@ default_print_registers_info (struct gdbarch *gdbarch,
opts.deref_ref = 1;
fprintf_filtered (file, "\t");
val_print (register_type (gdbarch, i), buffer, 0, 0,
file, 0, &opts, current_language);
file, 0, NULL, &opts, current_language);
}
}

View File

@ -44,6 +44,7 @@ extern const struct builtin_java_type *builtin_java_type (struct gdbarch *);
extern int java_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern int java_value_print (struct value *, struct ui_file *,

View File

@ -259,6 +259,7 @@ static void
java_print_value_fields (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream,
int recurse,
const struct value *val,
const struct value_print_options *options)
{
int i, len, n_baseclasses;
@ -302,7 +303,7 @@ java_print_value_fields (struct type *type, const gdb_byte *valaddr,
base_valaddr = valaddr;
java_print_value_fields (baseclass, base_valaddr, address + boffset,
stream, recurse + 1, options);
stream, recurse + 1, val, options);
fputs_filtered (", ", stream);
}
@ -392,6 +393,11 @@ java_print_value_fields (struct type *type, const gdb_byte *valaddr,
{
fputs_filtered ("<optimized out or zero length>", stream);
}
else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
TYPE_FIELD_BITSIZE (type, i)))
{
fputs_filtered (_("<value optimized out>"), stream);
}
else
{
struct value_print_options opts;
@ -440,7 +446,7 @@ java_print_value_fields (struct type *type, const gdb_byte *valaddr,
val_print (TYPE_FIELD_TYPE (type, i),
valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
address + TYPE_FIELD_BITPOS (type, i) / 8,
stream, recurse + 1, &opts,
stream, recurse + 1, val, &opts,
current_language);
}
}
@ -467,6 +473,7 @@ int
java_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
struct gdbarch *gdbarch = get_type_arch (type);
@ -543,12 +550,12 @@ java_val_print (struct type *type, const gdb_byte *valaddr,
case TYPE_CODE_STRUCT:
java_print_value_fields (type, valaddr, address, stream, recurse,
options);
val, options);
break;
default:
return c_val_print (type, valaddr, embedded_offset, address, stream,
recurse, options);
recurse, val, options);
}
return 0;

View File

@ -1107,6 +1107,7 @@ static int
unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_val_print called."));

View File

@ -233,6 +233,7 @@ struct language_defn
const gdb_byte *contents,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options);
/* Print a top-level value using syntax appropriate for this language. */
@ -401,9 +402,9 @@ extern enum language set_language (enum language);
#define LA_PRINT_TYPEDEF(type,new_symbol,stream) \
(current_language->la_print_typedef(type,new_symbol,stream))
#define LA_VAL_PRINT(type,valaddr,offset,addr,stream,recurse,options) \
#define LA_VAL_PRINT(type,valaddr,offset,addr,stream,val,recurse,options) \
(current_language->la_val_print(type,valaddr,offset,addr,stream, \
recurse,options))
val,recurse,options))
#define LA_VALUE_PRINT(val,stream,options) \
(current_language->la_value_print(val,stream,options))

View File

@ -34,6 +34,7 @@ extern int m2_is_unbounded_array (struct type *type);
extern int m2_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern int get_long_set_bounds (struct type *type, LONGEST *low,

View File

@ -38,6 +38,7 @@ static void
m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
int len);
@ -202,7 +203,7 @@ m2_print_unbounded_array (struct type *type, const gdb_byte *valaddr,
fprintf_filtered (stream, "{");
m2_print_array_contents (value_type (val), value_contents(val),
value_embedded_offset (val), addr, stream,
recurse, options, len);
recurse, NULL, options, len);
fprintf_filtered (stream, ", HIGH = %d}", (int) len);
}
@ -277,6 +278,7 @@ static void
m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
int len)
{
@ -299,7 +301,8 @@ m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
{
fprintf_filtered (stream, "{");
val_print_array_elements (type, valaddr + embedded_offset,
address, stream, recurse, options, 0);
address, stream, recurse, val,
options, 0);
fprintf_filtered (stream, "}");
}
}
@ -316,6 +319,7 @@ m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
int
m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *original_value,
const struct value_print_options *options)
{
struct gdbarch *gdbarch = get_type_arch (type);
@ -367,7 +371,8 @@ m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
{
fprintf_filtered (stream, "{");
val_print_array_elements (type, valaddr + embedded_offset,
address, stream, recurse, options, 0);
address, stream, recurse, original_value,
options, 0);
fprintf_filtered (stream, "}");
}
break;
@ -436,7 +441,8 @@ m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
address, stream, recurse, options);
else
cp_print_value_fields (type, type, valaddr, embedded_offset,
address, stream, recurse, options, NULL, 0);
address, stream, recurse, original_value,
options, NULL, 0);
break;
case TYPE_CODE_ENUM:
@ -508,7 +514,7 @@ m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
{
m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
address, stream, recurse, options);
address, stream, recurse, original_value, options);
break;
}
/* FIXME: create_range_type does not set the unsigned bit in a

View File

@ -1131,7 +1131,7 @@ get_register (struct frame_info *frame, int regnum, int format)
get_formatted_print_options (&opts, format);
opts.deref_ref = 1;
val_print (register_type (gdbarch, regnum), buffer, 0, 0,
stb->stream, 0, &opts, current_language);
stb->stream, 0, NULL, &opts, current_language);
ui_out_field_stream (uiout, "value", stb);
ui_out_stream_delete (stb);
}
@ -1222,9 +1222,7 @@ mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
/* Print the result of the expression evaluation. */
get_user_print_options (&opts);
opts.deref_ref = 0;
val_print (value_type (val), value_contents (val),
value_embedded_offset (val), value_address (val),
stb->stream, 0, &opts, current_language);
common_val_print (val, stb->stream, 0, &opts, current_language);
ui_out_field_stream (uiout, "value", stb);
ui_out_stream_delete (stb);

View File

@ -710,8 +710,8 @@ mt_registers_info (struct gdbarch *gdbarch,
get_raw_print_options (&opts);
opts.deref_ref = 1;
val_print (register_type (gdbarch, regnum), buf,
0, 0, file, 0, &opts,
current_language);
0, 0, file, 0, NULL,
&opts, current_language);
fputs_filtered ("\n", file);
}
else if (regnum == MT_MAC_REGNUM || regnum == MT_MAC_PSEUDOREG_REGNUM)

View File

@ -37,6 +37,7 @@ extern void pascal_print_typedef (struct type *, struct symbol *,
extern int pascal_val_print (struct type *, const gdb_byte *, int,
CORE_ADDR, struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern int pascal_value_print (struct value *, struct ui_file *,
@ -70,6 +71,7 @@ extern void
extern void pascal_object_print_value_fields (struct type *, const gdb_byte *,
CORE_ADDR, struct ui_file *,
int,
const struct value *,
const struct value_print_options *,
struct type **, int);

View File

@ -54,6 +54,7 @@ int
pascal_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *original_value,
const struct value_print_options *options)
{
struct gdbarch *gdbarch = get_type_arch (type);
@ -125,7 +126,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
i = 0;
}
val_print_array_elements (type, valaddr + embedded_offset, address, stream,
recurse, options, i);
recurse, original_value, options, i);
fprintf_filtered (stream, "}");
}
break;
@ -317,7 +318,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
}
else
pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream,
recurse, options, NULL, 0);
recurse, original_value, options, NULL, 0);
}
break;
@ -611,6 +612,7 @@ static void pascal_object_print_static_field (struct value *,
static void pascal_object_print_value (struct type *, const gdb_byte *,
CORE_ADDR, struct ui_file *, int,
const struct value *,
const struct value_print_options *,
struct type **);
@ -668,6 +670,7 @@ void
pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream,
int recurse,
const struct value *val,
const struct value_print_options *options,
struct type **dont_print_vb,
int dont_print_statmem)
@ -685,7 +688,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
duplicates of virtual baseclasses. */
if (n_baseclasses > 0)
pascal_object_print_value (type, valaddr, address, stream,
recurse + 1, options, dont_print_vb);
recurse + 1, val, options, dont_print_vb);
if (!len && n_baseclasses == 1)
fprintf_filtered (stream, "<No data fields>");
@ -774,6 +777,11 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
{
fputs_filtered ("<optimized out or zero length>", stream);
}
else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
TYPE_FIELD_BITSIZE (type, i)))
{
fputs_filtered (_("<value optimized out>"), stream);
}
else
{
struct value_print_options opts = *options;
@ -818,7 +826,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
val_print (TYPE_FIELD_TYPE (type, i),
valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
address + TYPE_FIELD_BITPOS (type, i) / 8,
stream, recurse + 1, &opts,
stream, recurse + 1, val, &opts,
current_language);
}
}
@ -849,6 +857,7 @@ static void
pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream,
int recurse,
const struct value *val,
const struct value_print_options *options,
struct type **dont_print_vb)
{
@ -923,7 +932,7 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
fprintf_filtered (stream, "<invalid address>");
else
pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
stream, recurse, options,
stream, recurse, val, options,
(struct type **) obstack_base (&dont_print_vb_obstack),
0);
fputs_filtered (", ", stream);
@ -987,7 +996,8 @@ pascal_object_print_static_field (struct value *val,
CHECK_TYPEDEF (type);
pascal_object_print_value_fields (type, value_contents (val), addr,
stream, recurse, options, NULL, 1);
stream, recurse, NULL, options,
NULL, 1);
return;
}

View File

@ -374,7 +374,7 @@ print_scalar_formatted (const void *valaddr, struct type *type,
struct value_print_options opts = *options;
opts.format = 0;
opts.deref_ref = 0;
val_print (type, valaddr, 0, 0, stream, 0, &opts,
val_print (type, valaddr, 0, 0, stream, 0, NULL, &opts,
current_language);
return;
}

View File

@ -603,6 +603,7 @@ int
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
@ -621,6 +622,16 @@ apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
valaddr += embedded_offset;
value = value_from_contents_and_address (type, valaddr,
address + embedded_offset);
if (val != NULL)
{
set_value_component_location (value, val);
/* set_value_component_location resets the address, so we may
need to set it again. */
if (VALUE_LVAL (value) != lval_internalvar
&& VALUE_LVAL (value) != lval_internalvar_component
&& VALUE_LVAL (value) != lval_computed)
set_value_address (value, address + embedded_offset);
}
val_obj = value_to_value_object (value);
if (! val_obj)
@ -735,6 +746,7 @@ int
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{

View File

@ -31,6 +31,7 @@ void source_python_script (FILE *stream, const char *file);
int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
const struct language_defn *language);

View File

@ -50,6 +50,7 @@ extern int scm_value_print (struct value *, struct ui_file *,
extern int scm_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value *,
const struct value_print_options *);
extern LONGEST scm_get_field (LONGEST, int, int, enum bfd_endian);

View File

@ -422,9 +422,12 @@ int
scm_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options)
{
if (is_scmvalue_type (type))
if (is_scmvalue_type (type)
&& value_bits_valid (val, TARGET_CHAR_BIT * embedded_offset,
TARGET_CHAR_BIT * TYPE_LENGTH (type)))
{
enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
LONGEST svalue
@ -443,7 +446,8 @@ scm_val_print (struct type *type, const gdb_byte *valaddr,
}
else
{
return c_val_print (type, valaddr, 0, address, stream, recurse, options);
return c_val_print (type, valaddr, 0, address, stream, recurse,
val, options);
}
}

View File

@ -2121,12 +2121,12 @@ sh64_do_register (struct gdbarch *gdbarch, struct ui_file *file,
get_formatted_print_options (&opts, 'x');
opts.deref_ref = 1;
val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
file, 0, &opts, current_language);
file, 0, NULL, &opts, current_language);
fprintf_filtered (file, "\t");
get_formatted_print_options (&opts, 0);
opts.deref_ref = 1;
val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
file, 0, &opts, current_language);
file, 0, NULL, &opts, current_language);
fprintf_filtered (file, "\n");
}

View File

@ -1,3 +1,9 @@
2010-06-11 Tom Tromey <tromey@redhat.com>
PR gdb/9977, PR exp/11636::
* gdb.dwarf2/pieces.exp (pieces_test_f3): Remove kfail.
(pieces_test_f6): Update expected output.
2010-06-11 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/moribund-step.exp: New.

View File

@ -76,8 +76,6 @@ proc pieces_test_f3 {} {
gdb_continue_to_breakpoint "continue to f3 breakpoint for pieces"
gdb_test "print a.i" " = 4" "print a.i in pieces:f3"
gdb_test "print a.j" " = 14" "print a.j in pieces:f3"
# Right now gdb says "value optimized out" here, but that is wrong.
setup_kfail "exp/11636" *-*-*
gdb_test "print a.i = 7" " = 7" "set a.i in pieces:f3"
gdb_test "print a.i" " = 7" "print new a.i in pieces:f3"
}
@ -90,7 +88,7 @@ proc pieces_test_f6 {} {
"set f6 breakpoint for pieces"
gdb_continue_to_breakpoint "continue to f6 breakpoint for pieces"
gdb_test "print a" \
"warning: bits .* in computed object were.* = {i = 7, j = 8, q = 0}" \
" = {i = 7, j = 8, q = .value optimized out.}" \
"print a with optimized out piece"
# Note: no warning for this case.
gdb_test_multiple "print a.i" \

View File

@ -941,11 +941,17 @@ value_fetch_lazy (struct value *val)
struct value *parent = value_parent (val);
LONGEST offset = value_offset (val);
LONGEST num = unpack_bits_as_long (value_type (val),
value_contents (parent) + offset,
(value_contents_for_printing (parent)
+ offset),
value_bitpos (val),
value_bitsize (val));
int length = TYPE_LENGTH (type);
if (!value_bits_valid (val,
TARGET_CHAR_BIT * offset + value_bitpos (val),
value_bitsize (val)))
error (_("value has been optimized out"));
store_signed_integer (value_contents_raw (val), length, byte_order, num);
}
else if (VALUE_LVAL (val) == lval_memory)
@ -1246,6 +1252,7 @@ value_assign (struct value *toval, struct value *fromval)
{
case lval_memory:
case lval_register:
case lval_computed:
reinit_frame_cache ();

View File

@ -245,6 +245,39 @@ scalar_type_p (struct type *type)
}
}
/* Helper function to check the validity of some bits of a value.
If TYPE represents some aggregate type (e.g., a structure), return 1.
Otherwise, any of the bytes starting at OFFSET and extending for
TYPE_LENGTH(TYPE) bytes are invalid, print a message to STREAM and
return 0. The checking is done using FUNCS.
Otherwise, return 1. */
static int
valprint_check_validity (struct ui_file *stream,
struct type *type,
int offset,
const struct value *val)
{
CHECK_TYPEDEF (type);
if (TYPE_CODE (type) != TYPE_CODE_UNION
&& TYPE_CODE (type) != TYPE_CODE_STRUCT
&& TYPE_CODE (type) != TYPE_CODE_ARRAY)
{
if (! value_bits_valid (val, TARGET_CHAR_BIT * offset,
TARGET_CHAR_BIT * TYPE_LENGTH (type)))
{
fprintf_filtered (stream, _("<value optimized out>"));
return 0;
}
}
return 1;
}
/* Print using the given LANGUAGE the data of type TYPE located at VALADDR
(within GDB), which came from the inferior at address ADDRESS, onto
stdio stream STREAM according to OPTIONS.
@ -263,6 +296,7 @@ scalar_type_p (struct type *type)
int
val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
CORE_ADDR address, struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
@ -283,16 +317,19 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
if (TYPE_STUB (real_type))
{
fprintf_filtered (stream, "<incomplete type>");
fprintf_filtered (stream, _("<incomplete type>"));
gdb_flush (stream);
return (0);
}
if (!valprint_check_validity (stream, real_type, embedded_offset, val))
return 0;
if (!options->raw)
{
ret = apply_val_pretty_printer (type, valaddr, embedded_offset,
address, stream, recurse, options,
language);
address, stream, recurse,
val, options, language);
if (ret)
return ret;
}
@ -308,7 +345,8 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
TRY_CATCH (except, RETURN_MASK_ERROR)
{
ret = language->la_val_print (type, valaddr, embedded_offset, address,
stream, recurse, &local_opts);
stream, recurse, val,
&local_opts);
}
if (except.reason < 0)
fprintf_filtered (stream, _("<error reading variable>"));
@ -329,7 +367,7 @@ value_check_printable (struct value *val, struct ui_file *stream)
return 0;
}
if (value_optimized_out (val))
if (value_entirely_optimized_out (val))
{
fprintf_filtered (stream, _("<value optimized out>"));
return 0;
@ -369,9 +407,10 @@ common_val_print (struct value *val, struct ui_file *stream, int recurse,
get a fixed representation of our value. */
val = ada_to_fixed_value (val);
return val_print (value_type (val), value_contents_all (val),
return val_print (value_type (val), value_contents_for_printing (val),
value_embedded_offset (val), value_address (val),
stream, recurse, options, language);
stream, recurse,
val, options, language);
}
/* Print on stream STREAM the value VAL according to OPTIONS. The value
@ -390,11 +429,11 @@ value_print (struct value *val, struct ui_file *stream,
if (!options->raw)
{
int r = apply_val_pretty_printer (value_type (val),
value_contents_all (val),
value_contents_for_printing (val),
value_embedded_offset (val),
value_address (val),
stream, 0, options,
current_language);
stream, 0,
val, options, current_language);
if (r)
return r;
@ -1097,6 +1136,7 @@ void
val_print_array_elements (struct type *type, const gdb_byte *valaddr,
CORE_ADDR address, struct ui_file *stream,
int recurse,
const struct value *val,
const struct value_print_options *options,
unsigned int i)
{
@ -1175,7 +1215,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr,
if (reps > options->repeat_count_threshold)
{
val_print (elttype, valaddr + i * eltlen, 0, address + i * eltlen,
stream, recurse + 1, options, current_language);
stream, recurse + 1, val, options, current_language);
annotate_elt_rep (reps);
fprintf_filtered (stream, " <repeats %u times>", reps);
annotate_elt_rep_end ();
@ -1186,7 +1226,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr,
else
{
val_print (elttype, valaddr + i * eltlen, 0, address + i * eltlen,
stream, recurse + 1, options, current_language);
stream, recurse + 1, val, options, current_language);
annotate_elt ();
things_printed++;
}

View File

@ -118,6 +118,7 @@ extern void maybe_print_array_index (struct type *index_type, LONGEST index,
extern void val_print_array_elements (struct type *, const gdb_byte *,
CORE_ADDR, struct ui_file *, int,
const struct value *,
const struct value_print_options *,
unsigned int);

View File

@ -349,7 +349,7 @@ value_next (struct value *value)
}
struct type *
value_type (struct value *value)
value_type (const struct value *value)
{
return value->type;
}
@ -360,7 +360,7 @@ deprecated_set_value_type (struct value *value, struct type *type)
}
int
value_offset (struct value *value)
value_offset (const struct value *value)
{
return value->offset;
}
@ -371,7 +371,7 @@ set_value_offset (struct value *value, int offset)
}
int
value_bitpos (struct value *value)
value_bitpos (const struct value *value)
{
return value->bitpos;
}
@ -382,7 +382,7 @@ set_value_bitpos (struct value *value, int bit)
}
int
value_bitsize (struct value *value)
value_bitsize (const struct value *value)
{
return value->bitsize;
}
@ -418,14 +418,29 @@ value_enclosing_type (struct value *value)
return value->enclosing_type;
}
static void
require_not_optimized_out (struct value *value)
{
if (value->optimized_out)
error (_("value has been optimized out"));
}
const gdb_byte *
value_contents_all (struct value *value)
value_contents_for_printing (struct value *value)
{
if (value->lazy)
value_fetch_lazy (value);
return value->contents;
}
const gdb_byte *
value_contents_all (struct value *value)
{
const gdb_byte *result = value_contents_for_printing (value);
require_not_optimized_out (value);
return result;
}
int
value_lazy (struct value *value)
{
@ -453,7 +468,9 @@ set_value_stack (struct value *value, int val)
const gdb_byte *
value_contents (struct value *value)
{
return value_contents_writeable (value);
const gdb_byte *result = value_contents_writeable (value);
require_not_optimized_out (value);
return result;
}
gdb_byte *
@ -496,6 +513,29 @@ set_value_optimized_out (struct value *value, int val)
value->optimized_out = val;
}
int
value_entirely_optimized_out (const struct value *value)
{
if (!value->optimized_out)
return 0;
if (value->lval != lval_computed
|| !value->location.computed.funcs->check_validity)
return 1;
return value->location.computed.funcs->check_all_valid (value);
}
int
value_bits_valid (const struct value *value, int offset, int length)
{
if (value == NULL || !value->optimized_out)
return 1;
if (value->lval != lval_computed
|| !value->location.computed.funcs->check_validity)
return 0;
return value->location.computed.funcs->check_validity (value, offset,
length);
}
int
value_embedded_offset (struct value *value)
{
@ -529,9 +569,9 @@ value_computed_funcs (struct value *v)
}
void *
value_computed_closure (struct value *v)
value_computed_closure (const struct value *v)
{
gdb_assert (VALUE_LVAL (v) == lval_computed);
gdb_assert (v->lval == lval_computed);
return v->location.computed.closure;
}
@ -771,15 +811,16 @@ value_copy (struct value *arg)
}
void
set_value_component_location (struct value *component, struct value *whole)
set_value_component_location (struct value *component,
const struct value *whole)
{
if (VALUE_LVAL (whole) == lval_internalvar)
if (whole->lval == lval_internalvar)
VALUE_LVAL (component) = lval_internalvar_component;
else
VALUE_LVAL (component) = VALUE_LVAL (whole);
VALUE_LVAL (component) = whole->lval;
component->location = whole->location;
if (VALUE_LVAL (whole) == lval_computed)
if (whole->lval == lval_computed)
{
struct lval_funcs *funcs = whole->location.computed.funcs;

View File

@ -50,7 +50,7 @@ struct value *value_next (struct value *);
/* Type of the value. */
extern struct type *value_type (struct value *);
extern struct type *value_type (const struct value *);
/* This is being used to change the type of an existing value, that
code should instead be creating a new value with the changed type
@ -61,14 +61,14 @@ extern void deprecated_set_value_type (struct value *value,
/* Only used for bitfields; number of bits contained in them. */
extern int value_bitsize (struct value *);
extern int value_bitsize (const struct value *);
extern void set_value_bitsize (struct value *, int bit);
/* Only used for bitfields; position of start of field. For
gdbarch_bits_big_endian=0 targets, it is the position of the LSB. For
gdbarch_bits_big_endian=1 targets, it is the position of the MSB. */
extern int value_bitpos (struct value *);
extern int value_bitpos (const struct value *);
extern void set_value_bitpos (struct value *, int bit);
/* Only used for bitfields; the containing value. This allows a
@ -83,7 +83,7 @@ struct value *value_parent (struct value *);
within the registers structure. Note also the member
embedded_offset below. */
extern int value_offset (struct value *);
extern int value_offset (const struct value *);
extern void set_value_offset (struct value *, int offset);
/* The comment from "struct value" reads: ``Is it modifiable? Only
@ -164,13 +164,21 @@ struct lval_funcs
should call 'error'. */
void (*write) (struct value *toval, struct value *fromval);
/* Check the validity of some bits in VALUE. This should return 1
if all the bits starting at OFFSET and extending for LENGTH bits
are valid, or 0 if any bit is invalid. */
int (*check_validity) (const struct value *value, int offset, int length);
/* Return 1 if any bit in VALUE is valid, 0 if they are all invalid. */
int (*check_all_valid) (const struct value *value);
/* Return a duplicate of VALUE's closure, for use in a new value.
This may simply return the same closure, if VALUE's is
reference-counted or statically allocated.
This may be NULL, in which case VALUE's closure is re-used in the
new value. */
void *(*copy_closure) (struct value *v);
void *(*copy_closure) (const struct value *v);
/* Drop VALUE's reference to its closure. Maybe this frees the
closure; maybe this decrements a reference count; maybe the
@ -195,7 +203,7 @@ extern struct lval_funcs *value_computed_funcs (struct value *value);
/* If VALUE is lval_computed, return its closure. The meaning of the
returned value depends on the functions VALUE uses. */
extern void *value_computed_closure (struct value *value);
extern void *value_computed_closure (const struct value *value);
/* If zero, contents of this value are in the contents field. If
nonzero, contents are in inferior. If the lval field is lval_memory,
@ -249,6 +257,11 @@ extern gdb_byte *value_contents_writeable (struct value *);
extern gdb_byte *value_contents_all_raw (struct value *);
extern const gdb_byte *value_contents_all (struct value *);
/* Like value_contents_all, but does not require that the returned
bits be valid. This should only be used in situations where you
plan to check the validity manually. */
extern const gdb_byte *value_contents_for_printing (struct value *value);
extern int value_fetch_lazy (struct value *val);
extern int value_contents_equal (struct value *val1, struct value *val2);
@ -257,6 +270,10 @@ extern int value_contents_equal (struct value *val1, struct value *val2);
extern int value_optimized_out (struct value *value);
extern void set_value_optimized_out (struct value *value, int val);
/* Like value_optimized_out, but return false if any bit in the object
is valid. */
extern int value_entirely_optimized_out (const struct value *value);
/* Set or return field indicating whether a variable is initialized or
not, based on debugging information supplied by the compiler.
1 = initialized; 0 = uninitialized. */
@ -266,7 +283,7 @@ extern void set_value_initialized (struct value *, int);
/* Set COMPONENT's location as appropriate for a component of WHOLE
--- regardless of what kind of lvalue WHOLE is. */
extern void set_value_component_location (struct value *component,
struct value *whole);
const struct value *whole);
/* While the following fields are per- VALUE .CONTENT .PIECE (i.e., a
single value might have multiple LVALs), this hacked interface is
@ -313,6 +330,13 @@ extern struct value *coerce_ref (struct value *value);
extern struct value *coerce_array (struct value *value);
/* Given a value, determine whether the bits starting at OFFSET and
extending for LENGTH bits are valid. This returns nonzero if all
bits in the given range are valid, zero if any bit is invalid. */
extern int value_bits_valid (const struct value *value,
int offset, int length);
#include "symtab.h"
@ -647,6 +671,7 @@ extern struct value *value_release_to_mark (struct value *mark);
extern int val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
const struct value *val,
const struct value_print_options *options,
const struct language_defn *language);