X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fvalprint.c;h=713998cc7a068b75cd0d1d72fdee40cd4d3d5731;hb=d4569d7bc572ae8f10d7c527cbdfbc9d26cc1ed8;hp=52a386afba3693c7b8974aede2ed51be133713be;hpb=f168693bc9d109c387e442119354bd57ecec8267;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valprint.c b/gdb/valprint.c index 52a386afba..713998cc7a 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -359,209 +359,265 @@ val_print_invalid_address (struct ui_file *stream) fprintf_filtered (stream, _("")); } -/* A generic val_print that is suitable for use by language - implementations of the la_val_print method. This function can - handle most type codes, though not all, notably exception - TYPE_CODE_UNION and TYPE_CODE_STRUCT, which must be implemented by - the caller. - - Most arguments are as to val_print. - - The additional DECORATIONS argument can be used to customize the - output in some small, language-specific ways. */ +/* Print a pointer based on the type of its target. -void -generic_val_print (struct type *type, const gdb_byte *valaddr, + Arguments to this functions are roughly the same as those in + generic_val_print. A difference is that ADDRESS is the address to print, + with embedded_offset already added. ELTTYPE represents + the pointed type after check_typedef. */ + +static void +print_unpacked_pointer (struct type *type, struct type *elttype, + CORE_ADDR address, struct ui_file *stream, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + + if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) + { + /* Try to print what function it points to. */ + print_function_pointer_address (options, gdbarch, address, stream); + return; + } + + if (options->symbol_print) + print_address_demangle (options, gdbarch, address, stream, demangle); + else if (options->addressprint) + fputs_filtered (paddress (gdbarch, address), stream); +} + +/* generic_val_print helper for TYPE_CODE_ARRAY. */ + +static void +generic_val_print_array (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, - const struct generic_val_print_decorations *decorations) + const struct value_print_options *options) { - struct gdbarch *gdbarch = get_type_arch (type); - unsigned int i = 0; /* Number of characters printed. */ - unsigned len; - struct type *elttype, *unresolved_elttype; - struct type *unresolved_type = type; - LONGEST val; - CORE_ADDR addr; + struct type *unresolved_elttype = TYPE_TARGET_TYPE (type); + struct type *elttype = check_typedef (unresolved_elttype); - type = check_typedef (type); - switch (TYPE_CODE (type)) + if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0) { - case TYPE_CODE_ARRAY: - unresolved_elttype = TYPE_TARGET_TYPE (type); - elttype = check_typedef (unresolved_elttype); - if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0) + LONGEST low_bound, high_bound; + + if (!get_array_bounds (type, &low_bound, &high_bound)) + error (_("Could not determine the array high bound")); + + if (options->prettyformat_arrays) { - LONGEST low_bound, high_bound; + print_spaces_filtered (2 + 2 * recurse, stream); + } - if (!get_array_bounds (type, &low_bound, &high_bound)) - error (_("Could not determine the array high bound")); + fprintf_filtered (stream, "{"); + val_print_array_elements (type, valaddr, embedded_offset, + address, stream, + recurse, original_value, options, 0); + fprintf_filtered (stream, "}"); + } + else + { + /* Array of unspecified length: treat like pointer to first elt. */ + print_unpacked_pointer (type, elttype, address + embedded_offset, stream, + options); + } - if (options->prettyformat_arrays) - { - print_spaces_filtered (2 + 2 * recurse, stream); - } +} - fprintf_filtered (stream, "{"); - val_print_array_elements (type, valaddr, embedded_offset, - address, stream, - recurse, original_value, options, 0); - fprintf_filtered (stream, "}"); - break; - } - /* Array of unspecified length: treat like pointer to first - elt. */ - addr = address + embedded_offset; - goto print_unpacked_pointer; +/* generic_val_print helper for TYPE_CODE_PTR. */ - case TYPE_CODE_MEMBERPTR: +static void +generic_val_print_ptr (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format && options->format != 's') + { val_print_scalar_formatted (type, valaddr, embedded_offset, original_value, options, 0, stream); - break; + } + else + { + struct type *unresolved_elttype = TYPE_TARGET_TYPE(type); + struct type *elttype = check_typedef (unresolved_elttype); + CORE_ADDR addr = unpack_pointer (type, + valaddr + embedded_offset * unit_size); - case TYPE_CODE_PTR: - if (options->format && options->format != 's') - { - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); - break; - } - unresolved_elttype = TYPE_TARGET_TYPE (type); - elttype = check_typedef (unresolved_elttype); - { - addr = unpack_pointer (type, valaddr + embedded_offset); - print_unpacked_pointer: + print_unpacked_pointer (type, elttype, addr, stream, options); + } +} - if (TYPE_CODE (elttype) == TYPE_CODE_FUNC) - { - /* Try to print what function it points to. */ - print_function_pointer_address (options, gdbarch, addr, stream); - return; - } - if (options->symbol_print) - print_address_demangle (options, gdbarch, addr, stream, demangle); - else if (options->addressprint) - fputs_filtered (paddress (gdbarch, addr), stream); - } - break; +/* generic_val_print helper for TYPE_CODE_MEMBERPTR. */ - case TYPE_CODE_REF: - elttype = check_typedef (TYPE_TARGET_TYPE (type)); - if (options->addressprint) - { - CORE_ADDR addr - = extract_typed_address (valaddr + embedded_offset, type); +static void +generic_val_print_memberptr (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, options, 0, stream); +} - fprintf_filtered (stream, "@"); - fputs_filtered (paddress (gdbarch, addr), stream); - if (options->deref_ref) - fputs_filtered (": ", stream); - } - /* De-reference the reference. */ +/* generic_val_print helper for TYPE_CODE_REF. */ + +static void +generic_val_print_ref (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, int recurse, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type)); + + if (options->addressprint) + { + CORE_ADDR addr + = extract_typed_address (valaddr + embedded_offset, type); + + fprintf_filtered (stream, "@"); + fputs_filtered (paddress (gdbarch, addr), stream); if (options->deref_ref) + fputs_filtered (": ", stream); + } + /* De-reference the reference. */ + if (options->deref_ref) + { + if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) { - if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) - { - struct value *deref_val; - - deref_val = coerce_ref_if_computed (original_value); - if (deref_val != NULL) - { - /* More complicated computed references are not supported. */ - gdb_assert (embedded_offset == 0); - } - else - deref_val = value_at (TYPE_TARGET_TYPE (type), - unpack_pointer (type, - (valaddr - + embedded_offset))); + struct value *deref_val; - common_val_print (deref_val, stream, recurse, options, - current_language); + deref_val = coerce_ref_if_computed (original_value); + if (deref_val != NULL) + { + /* More complicated computed references are not supported. */ + gdb_assert (embedded_offset == 0); } else - fputs_filtered ("???", stream); + deref_val = value_at (TYPE_TARGET_TYPE (type), + unpack_pointer (type, + (valaddr + + embedded_offset))); + + common_val_print (deref_val, stream, recurse, options, + current_language); } - break; + else + fputs_filtered ("???", stream); + } +} - case TYPE_CODE_ENUM: - if (options->format) +/* generic_val_print helper for TYPE_CODE_ENUM. */ + +static void +generic_val_print_enum (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + unsigned int i; + unsigned int len; + LONGEST val; + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format) + { + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, options, 0, stream); + return; + } + len = TYPE_NFIELDS (type); + val = unpack_long (type, valaddr + embedded_offset * unit_size); + for (i = 0; i < len; i++) + { + QUIT; + if (val == TYPE_FIELD_ENUMVAL (type, i)) { - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); break; } - len = TYPE_NFIELDS (type); - val = unpack_long (type, valaddr + embedded_offset); - for (i = 0; i < len; i++) + } + if (i < len) + { + fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + } + else if (TYPE_FLAG_ENUM (type)) + { + int first = 1; + + /* We have a "flag" enum, so we try to decompose it into + pieces as appropriate. A flag enum has disjoint + constants by definition. */ + fputs_filtered ("(", stream); + for (i = 0; i < len; ++i) { QUIT; - if (val == TYPE_FIELD_ENUMVAL (type, i)) + + if ((val & TYPE_FIELD_ENUMVAL (type, i)) != 0) { - break; + if (!first) + fputs_filtered (" | ", stream); + first = 0; + + val &= ~TYPE_FIELD_ENUMVAL (type, i); + fputs_filtered (TYPE_FIELD_NAME (type, i), stream); } } - if (i < len) + + if (first || val != 0) { - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + if (!first) + fputs_filtered (" | ", stream); + fputs_filtered ("unknown: ", stream); + print_longest (stream, 'd', 0, val); } - else if (TYPE_FLAG_ENUM (type)) - { - int first = 1; - /* We have a "flag" enum, so we try to decompose it into - pieces as appropriate. A flag enum has disjoint - constants by definition. */ - fputs_filtered ("(", stream); - for (i = 0; i < len; ++i) - { - QUIT; + fputs_filtered (")", stream); + } + else + print_longest (stream, 'd', 0, val); +} - if ((val & TYPE_FIELD_ENUMVAL (type, i)) != 0) - { - if (!first) - fputs_filtered (" | ", stream); - first = 0; +/* generic_val_print helper for TYPE_CODE_FLAGS. */ - val &= ~TYPE_FIELD_ENUMVAL (type, i); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); - } - } +static void +generic_val_print_flags (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) - if (first || val != 0) - { - if (!first) - fputs_filtered (" | ", stream); - fputs_filtered ("unknown: ", stream); - print_longest (stream, 'd', 0, val); - } +{ + if (options->format) + val_print_scalar_formatted (type, valaddr, embedded_offset, original_value, + options, 0, stream); + else + val_print_type_code_flags (type, valaddr + embedded_offset, stream); +} - fputs_filtered (")", stream); - } - else - print_longest (stream, 'd', 0, val); - break; +/* generic_val_print helper for TYPE_CODE_FUNC and TYPE_CODE_METHOD. */ - case TYPE_CODE_FLAGS: - if (options->format) - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); - else - val_print_type_code_flags (type, valaddr + embedded_offset, - stream); - break; +static void +generic_val_print_func (struct type *type, const gdb_byte *valaddr, + int embedded_offset, CORE_ADDR address, + struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); - case TYPE_CODE_FUNC: - case TYPE_CODE_METHOD: - if (options->format) - { - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); - break; - } + if (options->format) + { + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, options, 0, stream); + } + else + { /* FIXME, we should consider, at least for ANSI C language, eliminating the distinction made between FUNCs and POINTERs to FUNCs. */ @@ -570,27 +626,239 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, fprintf_filtered (stream, "} "); /* Try to print what function it points to, and its address. */ print_address_demangle (options, gdbarch, address, stream, demangle); + } +} + +/* generic_val_print helper for TYPE_CODE_BOOL. */ + +static void +generic_val_print_bool (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options, + const struct generic_val_print_decorations *decorations) +{ + LONGEST val; + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format || options->output_format) + { + struct value_print_options opts = *options; + opts.format = (options->format ? options->format + : options->output_format); + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, &opts, 0, stream); + } + else + { + val = unpack_long (type, valaddr + embedded_offset * unit_size); + if (val == 0) + fputs_filtered (decorations->false_name, stream); + else if (val == 1) + fputs_filtered (decorations->true_name, stream); + else + print_longest (stream, 'd', 0, val); + } +} + +/* generic_val_print helper for TYPE_CODE_INT. */ + +static void +generic_val_print_int (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format || options->output_format) + { + struct value_print_options opts = *options; + + opts.format = (options->format ? options->format + : options->output_format); + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, &opts, 0, stream); + } + else + val_print_type_code_int (type, valaddr + embedded_offset * unit_size, + stream); +} + +/* generic_val_print helper for TYPE_CODE_CHAR. */ + +static void +generic_val_print_char (struct type *type, struct type *unresolved_type, + const gdb_byte *valaddr, int embedded_offset, + struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + LONGEST val; + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format || options->output_format) + { + struct value_print_options opts = *options; + + opts.format = (options->format ? options->format + : options->output_format); + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, &opts, 0, stream); + } + else + { + val = unpack_long (type, valaddr + embedded_offset * unit_size); + if (TYPE_UNSIGNED (type)) + fprintf_filtered (stream, "%u", (unsigned int) val); + else + fprintf_filtered (stream, "%d", (int) val); + fputs_filtered (" ", stream); + LA_PRINT_CHAR (val, unresolved_type, stream); + } +} + +/* generic_val_print helper for TYPE_CODE_FLT. */ + +static void +generic_val_print_float (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format) + { + val_print_scalar_formatted (type, valaddr, embedded_offset, + original_value, options, 0, stream); + } + else + { + print_floating (valaddr + embedded_offset * unit_size, type, stream); + } +} + +/* generic_val_print helper for TYPE_CODE_DECFLOAT. */ + +static void +generic_val_print_decfloat (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options) +{ + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + if (options->format) + val_print_scalar_formatted (type, valaddr, embedded_offset, original_value, + options, 0, stream); + else + print_decimal_floating (valaddr + embedded_offset * unit_size, type, + stream); +} + +/* generic_val_print helper for TYPE_CODE_COMPLEX. */ + +static void +generic_val_print_complex (struct type *type, const gdb_byte *valaddr, + int embedded_offset, struct ui_file *stream, + const struct value *original_value, + const struct value_print_options *options, + const struct generic_val_print_decorations + *decorations) +{ + struct gdbarch *gdbarch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (gdbarch); + + fprintf_filtered (stream, "%s", decorations->complex_prefix); + if (options->format) + val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr, + embedded_offset, original_value, options, 0, + stream); + else + print_floating (valaddr + embedded_offset * unit_size, + TYPE_TARGET_TYPE (type), stream); + fprintf_filtered (stream, "%s", decorations->complex_infix); + if (options->format) + val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr, + embedded_offset + + type_length_units (TYPE_TARGET_TYPE (type)), + original_value, options, 0, stream); + else + print_floating (valaddr + embedded_offset * unit_size + + TYPE_LENGTH (TYPE_TARGET_TYPE (type)), + TYPE_TARGET_TYPE (type), stream); + fprintf_filtered (stream, "%s", decorations->complex_suffix); +} + +/* A generic val_print that is suitable for use by language + implementations of the la_val_print method. This function can + handle most type codes, though not all, notably exception + TYPE_CODE_UNION and TYPE_CODE_STRUCT, which must be implemented by + the caller. + + Most arguments are as to val_print. + + The additional DECORATIONS argument can be used to customize the + output in some small, language-specific ways. */ + +void +generic_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, + const struct generic_val_print_decorations *decorations) +{ + struct type *unresolved_type = type; + + type = check_typedef (type); + switch (TYPE_CODE (type)) + { + case TYPE_CODE_ARRAY: + generic_val_print_array (type, valaddr, embedded_offset, address, stream, + recurse, original_value, options); + break; + + case TYPE_CODE_MEMBERPTR: + generic_val_print_memberptr (type, valaddr, embedded_offset, stream, + original_value, options); + break; + + case TYPE_CODE_PTR: + generic_val_print_ptr (type, valaddr, embedded_offset, stream, + original_value, options); + break; + + case TYPE_CODE_REF: + generic_val_print_ref (type, valaddr, embedded_offset, stream, recurse, + original_value, options); + break; + + case TYPE_CODE_ENUM: + generic_val_print_enum (type, valaddr, embedded_offset, stream, + original_value, options); + break; + + case TYPE_CODE_FLAGS: + generic_val_print_flags (type, valaddr, embedded_offset, stream, + original_value, options); + break; + + case TYPE_CODE_FUNC: + case TYPE_CODE_METHOD: + generic_val_print_func (type, valaddr, embedded_offset, address, stream, + original_value, options); break; case TYPE_CODE_BOOL: - if (options->format || options->output_format) - { - struct value_print_options opts = *options; - opts.format = (options->format ? options->format - : options->output_format); - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, &opts, 0, stream); - } - else - { - val = unpack_long (type, valaddr + embedded_offset); - if (val == 0) - fputs_filtered (decorations->false_name, stream); - else if (val == 1) - fputs_filtered (decorations->true_name, stream); - else - print_longest (stream, 'd', 0, val); - } + generic_val_print_bool (type, valaddr, embedded_offset, stream, + original_value, options, decorations); break; case TYPE_CODE_RANGE: @@ -605,60 +873,23 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, /* FALLTHROUGH */ case TYPE_CODE_INT: - if (options->format || options->output_format) - { - struct value_print_options opts = *options; - - opts.format = (options->format ? options->format - : options->output_format); - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, &opts, 0, stream); - } - else - val_print_type_code_int (type, valaddr + embedded_offset, stream); + generic_val_print_int (type, valaddr, embedded_offset, stream, + original_value, options); break; case TYPE_CODE_CHAR: - if (options->format || options->output_format) - { - struct value_print_options opts = *options; - - opts.format = (options->format ? options->format - : options->output_format); - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, &opts, 0, stream); - } - else - { - val = unpack_long (type, valaddr + embedded_offset); - if (TYPE_UNSIGNED (type)) - fprintf_filtered (stream, "%u", (unsigned int) val); - else - fprintf_filtered (stream, "%d", (int) val); - fputs_filtered (" ", stream); - LA_PRINT_CHAR (val, unresolved_type, stream); - } + generic_val_print_char (type, unresolved_type, valaddr, embedded_offset, + stream, original_value, options); break; case TYPE_CODE_FLT: - if (options->format) - { - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); - } - else - { - print_floating (valaddr + embedded_offset, type, stream); - } + generic_val_print_float (type, valaddr, embedded_offset, stream, + original_value, options); break; case TYPE_CODE_DECFLOAT: - if (options->format) - val_print_scalar_formatted (type, valaddr, embedded_offset, - original_value, options, 0, stream); - else - print_decimal_floating (valaddr + embedded_offset, - type, stream); + generic_val_print_decfloat (type, valaddr, embedded_offset, stream, + original_value, options); break; case TYPE_CODE_VOID: @@ -678,29 +909,8 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, break; case TYPE_CODE_COMPLEX: - fprintf_filtered (stream, "%s", decorations->complex_prefix); - if (options->format) - val_print_scalar_formatted (TYPE_TARGET_TYPE (type), - valaddr, embedded_offset, - original_value, options, 0, stream); - else - print_floating (valaddr + embedded_offset, - TYPE_TARGET_TYPE (type), - stream); - fprintf_filtered (stream, "%s", decorations->complex_infix); - if (options->format) - val_print_scalar_formatted (TYPE_TARGET_TYPE (type), - valaddr, - embedded_offset - + TYPE_LENGTH (TYPE_TARGET_TYPE (type)), - original_value, - options, 0, stream); - else - print_floating (valaddr + embedded_offset - + TYPE_LENGTH (TYPE_TARGET_TYPE (type)), - TYPE_TARGET_TYPE (type), - stream); - fprintf_filtered (stream, "%s", decorations->complex_suffix); + generic_val_print_complex (type, valaddr, embedded_offset, stream, + original_value, options, decorations); break; case TYPE_CODE_UNION: @@ -964,6 +1174,9 @@ val_print_scalar_formatted (struct type *type, int size, struct ui_file *stream) { + struct gdbarch *arch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (arch); + gdb_assert (val != NULL); gdb_assert (valaddr == value_contents_for_printing_const (val)); @@ -989,7 +1202,7 @@ val_print_scalar_formatted (struct type *type, else if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type))) val_print_unavailable (stream); else - print_scalar_formatted (valaddr + embedded_offset, type, + print_scalar_formatted (valaddr + embedded_offset * unit_size, type, options, size, stream); } @@ -1637,7 +1850,7 @@ val_print_array_elements (struct type *type, LONGEST low_pos, high_pos; elttype = TYPE_TARGET_TYPE (type); - eltlen = TYPE_LENGTH (check_typedef (elttype)); + eltlen = type_length_units (check_typedef (elttype)); index_type = TYPE_INDEX_TYPE (type); if (get_array_bounds (type, &low_bound, &high_bound))