X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fvalprint.c;h=713998cc7a068b75cd0d1d72fdee40cd4d3d5731;hb=12264a451d993a0a8635be82bed15618e0f4645f;hp=fbecd512d76297c402725b332f8859fb5dc6594c;hpb=fe43fede4726122efbee9d52b9e68b47be97757f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/valprint.c b/gdb/valprint.c index fbecd512d7..713998cc7a 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -433,6 +433,9 @@ generic_val_print_ptr (struct type *type, const gdb_byte *valaddr, 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, @@ -442,7 +445,8 @@ generic_val_print_ptr (struct type *type, const gdb_byte *valaddr, { struct type *unresolved_elttype = TYPE_TARGET_TYPE(type); struct type *elttype = check_typedef (unresolved_elttype); - CORE_ADDR addr = unpack_pointer (type, valaddr + embedded_offset); + CORE_ADDR addr = unpack_pointer (type, + valaddr + embedded_offset * unit_size); print_unpacked_pointer (type, elttype, addr, stream, options); } @@ -509,6 +513,289 @@ generic_val_print_ref (struct type *type, const gdb_byte *valaddr, } } +/* 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)) + { + break; + } + } + 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)) != 0) + { + if (!first) + fputs_filtered (" | ", stream); + first = 0; + + val &= ~TYPE_FIELD_ENUMVAL (type, i); + fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + } + } + + if (first || val != 0) + { + if (!first) + fputs_filtered (" | ", stream); + fputs_filtered ("unknown: ", stream); + print_longest (stream, 'd', 0, val); + } + + fputs_filtered (")", stream); + } + else + print_longest (stream, 'd', 0, val); +} + +/* generic_val_print helper for TYPE_CODE_FLAGS. */ + +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 (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); +} + +/* generic_val_print helper for TYPE_CODE_FUNC and TYPE_CODE_METHOD. */ + +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); + + 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. */ + fprintf_filtered (stream, "{"); + type_print (type, "", stream, -1); + 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 @@ -528,11 +815,7 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, const struct value_print_options *options, const struct generic_val_print_decorations *decorations) { - struct gdbarch *gdbarch = get_type_arch (type); - unsigned int i = 0; /* Number of characters printed. */ - unsigned len; struct type *unresolved_type = type; - LONGEST val; type = check_typedef (type); switch (TYPE_CODE (type)) @@ -558,109 +841,24 @@ generic_val_print (struct type *type, const gdb_byte *valaddr, break; case TYPE_CODE_ENUM: - if (options->format) - { - 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++) - { - QUIT; - if (val == TYPE_FIELD_ENUMVAL (type, i)) - { - break; - } - } - 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)) != 0) - { - if (!first) - fputs_filtered (" | ", stream); - first = 0; - - val &= ~TYPE_FIELD_ENUMVAL (type, i); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); - } - } - - if (first || val != 0) - { - if (!first) - fputs_filtered (" | ", stream); - fputs_filtered ("unknown: ", stream); - print_longest (stream, 'd', 0, val); - } - - fputs_filtered (")", stream); - } - else - print_longest (stream, 'd', 0, val); + generic_val_print_enum (type, valaddr, embedded_offset, stream, + original_value, options); break; 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); + generic_val_print_flags (type, valaddr, embedded_offset, stream, + original_value, options); break; 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; - } - /* FIXME, we should consider, at least for ANSI C language, - eliminating the distinction made between FUNCs and POINTERs - to FUNCs. */ - fprintf_filtered (stream, "{"); - type_print (type, "", stream, -1); - 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_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: @@ -675,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: @@ -748,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: @@ -1034,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)); @@ -1059,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); } @@ -1707,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))