diff options
author | Pedro Alves <palves@redhat.com> | 2011-01-24 18:54:17 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-01-24 18:54:17 +0000 |
commit | 490f124f0943a59ca6829a030164f79716600166 (patch) | |
tree | 0140c25ba1bd8fa65f9242d98bacbb0177e8514b /gdb/f-valprint.c | |
parent | 23b1e6e45074aded91b36b498a953d611da21b47 (diff) | |
download | gdb-490f124f0943a59ca6829a030164f79716600166.zip gdb-490f124f0943a59ca6829a030164f79716600166.tar.gz gdb-490f124f0943a59ca6829a030164f79716600166.tar.bz2 |
2011-01-24 Pedro Alves <pedro@codesourcery.com>
Don't lose embedded_offset in printing routines throughout.
gdb/
* valprint.h (val_print_array_elements): Change prototype.
* valprint.c (val_print_array_elements): Add `embedded_offset'
parameter, and adjust to pass it down to val_print, while passing
`valaddr' or `address' unmodified. Take embedded_offset into
account when checking repetitions.
* c-valprint.c (c_val_print): Pass embedded_offset to
val_print_array_elements instead of adjusting `valaddr' and
`address'.
* m2-valprint.c (m2_print_array_contents, m2_val_print): Pass
embedded_offset to val_print_array_elements instead of adjusting
`valaddr'.
* p-lang.h (pascal_object_print_value_fields): Adjust prototype.
* p-valprint.c (pascal_val_print): Pass embedded_offset to
val_print_array_elements and pascal_object_print_value_fields
instead of adjusting `valaddr'.
(pascal_object_print_value_fields): Add `offset' parameter, and
adjust to use it.
(pascal_object_print_value): Add `offset' parameter, and adjust to
use it.
(pascal_object_print_static_field): Use
value_contents_for_printing/value_embedded_offset, rather than
value_contents.
* ada-valprint.c (val_print_packed_array_elements): Add `offset'
parameter, and adjust to use it. Use
value_contents_for_printing/value_embedded_offset, rather than
value_contents.
(ada_val_print): Rename `valaddr0' parameter to `valaddr'.
(ada_val_print_array): Add `offset' parameter, and adjust to use
it.
(ada_val_print_1): Rename `valaddr0' parameter to `valaddr', and
`embedded_offset' to `offset'. Don't re-adjust `valaddr'.
Instead work with offsets. Use
value_contents_for_printing/value_embedded_offset, rather than
value_contents. Change `defer_val_int' local type to CORE_ADDR,
and use value_from_pointer to extract a target pointer, rather
than value_from_longest.
(print_variant_part): Add `offset' parameter. Replace
`outer_valaddr' parameter by a new `outer_offset' parameter.
Don't re-adjust `valaddr'. Instead pass down adjusted offsets.
(ada_value_print): Use
value_contents_for_printing/value_embedded_offset, rather than
value_contents.
(print_record): Add `offset' parameter, and adjust to pass it
down.
(print_field_values): Add `offset' parameter. Replace
`outer_valaddr' parameter by a new `outer_offset' parameter.
Don't re-adjust `valaddr'. Instead pass down adjusted offsets.
Use value_contents_for_printing/value_embedded_offset, rather than
value_contents.
* d-valprint.c (dynamic_array_type): Use
value_contents_for_printing/value_embedded_offset, rather than
value_contents.
* jv-valprint.c (java_print_value_fields): Add `offset' parameter.
Don't re-adjust `valaddr'. Instead pass down adjusted offsets.
(java_print_value_fields): Take `offset' into account. Don't
re-adjust `valaddr'. Instead pass down adjusted offsets.
(java_val_print): Take `embedded_offset' into account. Pass it to
java_print_value_fields.
* f-valprint.c (f77_print_array_1): Add `embedded_offset'
parameter. Don't re-adjust `valaddr' or `address'. Instead pass
down adjusted offsets.
(f77_print_array): Add `embedded_offset' parameter. Pass it down.
(f_val_print): Take `embedded_offset' into account.
gdb/testsuite/
* gdb.base/printcmds.c (some_struct): New struct and instance.
* gdb.base/printcmds.exp (test_print_repeats_embedded_array): New
procedure.
<global scope>: Call it.
Diffstat (limited to 'gdb/f-valprint.c')
-rw-r--r-- | gdb/f-valprint.c | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 4d26ade..94a70a1 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -163,7 +163,8 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream) static void f77_print_array_1 (int nss, int ndimensions, struct type *type, - const gdb_byte *valaddr, CORE_ADDR address, + 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, @@ -179,8 +180,9 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, { fprintf_filtered (stream, "( "); f77_print_array_1 (nss + 1, ndimensions, TYPE_TARGET_TYPE (type), - valaddr + i * F77_DIM_OFFSET (nss), - address + i * F77_DIM_OFFSET (nss), + valaddr, + embedded_offset + i * F77_DIM_OFFSET (nss), + address, stream, recurse, val, options, elts); fprintf_filtered (stream, ") "); } @@ -193,10 +195,10 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, i++, (*elts)++) { val_print (TYPE_TARGET_TYPE (type), - valaddr + i * F77_DIM_OFFSET (ndimensions), - 0, - address + i * F77_DIM_OFFSET (ndimensions), - stream, recurse, val, options, current_language); + valaddr, + embedded_offset + i * F77_DIM_OFFSET (ndimensions), + address, stream, recurse, + val, options, current_language); if (i != (F77_DIM_SIZE (nss) - 1)) fprintf_filtered (stream, ", "); @@ -213,6 +215,7 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, static void f77_print_array (struct type *type, const gdb_byte *valaddr, + int embedded_offset, CORE_ADDR address, struct ui_file *stream, int recurse, const struct value *val, @@ -234,8 +237,8 @@ Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"), f77_create_arrayprint_offset_tbl (type, stream); - f77_print_array_1 (1, ndimensions, type, valaddr, address, stream, - recurse, val, options, &elts); + f77_print_array_1 (1, ndimensions, type, valaddr, embedded_offset, + address, stream, recurse, val, options, &elts); } @@ -266,25 +269,27 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, case TYPE_CODE_STRING: f77_get_dynamic_length_of_aggregate (type); LA_PRINT_STRING (stream, builtin_type (gdbarch)->builtin_char, - valaddr, TYPE_LENGTH (type), NULL, 0, options); + valaddr + embedded_offset, + TYPE_LENGTH (type), NULL, 0, options); break; case TYPE_CODE_ARRAY: fprintf_filtered (stream, "("); - f77_print_array (type, valaddr, address, stream, - recurse, original_value, options); + f77_print_array (type, valaddr, embedded_offset, + address, stream, recurse, original_value, options); fprintf_filtered (stream, ")"); break; case TYPE_CODE_PTR: if (options->format && options->format != 's') { - print_scalar_formatted (valaddr, type, options, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, options, 0, stream); break; } else { - addr = unpack_pointer (type, valaddr); + addr = unpack_pointer (type, valaddr + embedded_offset); elttype = check_typedef (TYPE_TARGET_TYPE (type)); if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) @@ -347,7 +352,8 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, case TYPE_CODE_FUNC: if (options->format) { - print_scalar_formatted (valaddr, type, options, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, options, 0, stream); break; } /* FIXME, we should consider, at least for ANSI C language, eliminating @@ -366,36 +372,41 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, opts.format = (options->format ? options->format : options->output_format); - print_scalar_formatted (valaddr, type, &opts, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, &opts, 0, stream); } else { - val_print_type_code_int (type, valaddr, stream); + val_print_type_code_int (type, valaddr + embedded_offset, stream); /* C and C++ has no single byte int type, char is used instead. Since we don't know whether the value is really intended to be used as an integer or a character, print the character equivalent as well. */ if (TYPE_LENGTH (type) == 1) { + LONGEST c; + fputs_filtered (" ", stream); - LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr), - type, stream); + c = unpack_long (type, valaddr + embedded_offset); + LA_PRINT_CHAR ((unsigned char) c, type, stream); } } break; case TYPE_CODE_FLAGS: if (options->format) - print_scalar_formatted (valaddr, type, options, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, options, 0, stream); else - val_print_type_code_flags (type, valaddr, stream); + val_print_type_code_flags (type, valaddr + embedded_offset, stream); break; case TYPE_CODE_FLT: if (options->format) - print_scalar_formatted (valaddr, type, options, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, options, 0, stream); else - print_floating (valaddr, type, stream); + print_floating (valaddr + embedded_offset, type, stream); break; case TYPE_CODE_VOID: @@ -418,11 +429,12 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, opts.format = (options->format ? options->format : options->output_format); - print_scalar_formatted (valaddr, type, &opts, 0, stream); + print_scalar_formatted (valaddr + embedded_offset, + type, &opts, 0, stream); } else { - val = extract_unsigned_integer (valaddr, + val = extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type), byte_order); if (val == 0) fprintf_filtered (stream, ".FALSE."); @@ -433,7 +445,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; - val_print (type, valaddr, 0, address, stream, recurse, + val_print (type, valaddr, embedded_offset, + address, stream, recurse, original_value, options, current_language); /* Restore the type code so later uses work as intended. */ TYPE_CODE (type) = TYPE_CODE_BOOL; @@ -444,9 +457,10 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, case TYPE_CODE_COMPLEX: type = TYPE_TARGET_TYPE (type); fputs_filtered ("(", stream); - print_floating (valaddr, type, stream); + print_floating (valaddr + embedded_offset, type, stream); fputs_filtered (",", stream); - print_floating (valaddr + TYPE_LENGTH (type), type, stream); + print_floating (valaddr + embedded_offset + TYPE_LENGTH (type), + type, stream); fputs_filtered (")", stream); break; @@ -466,8 +480,9 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, { int offset = TYPE_FIELD_BITPOS (type, index) / 8; - val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset, - embedded_offset, address, stream, recurse + 1, + val_print (TYPE_FIELD_TYPE (type, index), valaddr, + embedded_offset + offset, + address, stream, recurse + 1, original_value, options, current_language); if (index != TYPE_NFIELDS (type) - 1) fputs_filtered (", ", stream); |