diff options
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r-- | gdb/printcmd.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c index fae39fe..021e191 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -309,6 +309,24 @@ print_formatted (struct value *val, int format, int size, format, size, stream); } +/* Return builtin floating point type of same length as TYPE. + If no such type is found, return TYPE itself. */ +static struct type * +float_type_from_length (struct gdbarch *gdbarch, struct type *type) +{ + const struct builtin_type *builtin = builtin_type (gdbarch); + unsigned int len = TYPE_LENGTH (type); + + if (len == TYPE_LENGTH (builtin->builtin_float)) + type = builtin->builtin_float; + else if (len == TYPE_LENGTH (builtin->builtin_double)) + type = builtin->builtin_double; + else if (len == TYPE_LENGTH (builtin->builtin_long_double)) + type = builtin->builtin_long_double; + + return type; +} + /* Print a scalar of data of type TYPE, pointed to in GDB by VALADDR, according to letters FORMAT and SIZE on STREAM. FORMAT may not be zero. Formats s and i are not supported at this level. @@ -434,12 +452,7 @@ print_scalar_formatted (const void *valaddr, struct type *type, break; case 'f': - if (len == TYPE_LENGTH (builtin_type_float)) - type = builtin_type_float; - else if (len == TYPE_LENGTH (builtin_type_double)) - type = builtin_type_double; - else if (len == TYPE_LENGTH (builtin_type_long_double)) - type = builtin_type_long_double; + type = float_type_from_length (current_gdbarch, type); print_floating (valaddr, type, stream); break; @@ -1999,17 +2012,6 @@ printf_command (char *arg, int from_tty) s1 = s; val_args[nargs] = parse_to_comma_and_eval (&s1); - /* If format string wants a float, unchecked-convert the value to - floating point of the same size */ - - if (argclass[nargs] == double_arg) - { - struct type *type = value_type (val_args[nargs]); - if (TYPE_LENGTH (type) == sizeof (float)) - deprecated_set_value_type (val_args[nargs], builtin_type_float); - if (TYPE_LENGTH (type) == sizeof (double)) - deprecated_set_value_type (val_args[nargs], builtin_type_double); - } nargs++; s = s1; if (*s == ',') @@ -2053,15 +2055,35 @@ printf_command (char *arg, int from_tty) break; case double_arg: { - double val = value_as_double (val_args[i]); - printf_filtered (current_substring, val); + struct type *type = value_type (val_args[i]); + DOUBLEST val; + int inv; + + /* If format string wants a float, unchecked-convert the value + to floating point of the same size. */ + type = float_type_from_length (current_gdbarch, type); + val = unpack_double (type, value_contents (val_args[i]), &inv); + if (inv) + error (_("Invalid floating value found in program.")); + + printf_filtered (current_substring, (double) val); break; } case long_double_arg: #ifdef HAVE_LONG_DOUBLE { - long double val = value_as_double (val_args[i]); - printf_filtered (current_substring, val); + struct type *type = value_type (val_args[i]); + DOUBLEST val; + int inv; + + /* If format string wants a float, unchecked-convert the value + to floating point of the same size. */ + type = float_type_from_length (current_gdbarch, type); + val = unpack_double (type, value_contents (val_args[i]), &inv); + if (inv) + error (_("Invalid floating value found in program.")); + + printf_filtered (current_substring, (long double) val); break; } #else |