From 8ba0dd515c1ba23318f28c6bb04c9da573855b50 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 24 Oct 2017 18:01:39 +0200 Subject: [PATCH] Target FP printing: Use floatformat_to_string in tdep code A few tdep files use target-specific printing routines to output values in the floating-point registers. To get rid of host floating-point code, this patch changes them to use floatformat_to_string instead. No functional change intended, the resulting output should look the same. ChangeLog: 2017-10-24 Ulrich Weigand * i387-tdep.c (print_i387_value): Use floatformat_to_string. * sh64-tdep.c (sh64_do_fp_register): Likewise. * mips-tdep.c (mips_print_fp_register): Likewise. --- gdb/ChangeLog | 6 ++++++ gdb/i387-tdep.c | 17 ++++------------- gdb/mips-tdep.c | 45 ++++++++++++++------------------------------- gdb/sh64-tdep.c | 14 ++++---------- 4 files changed, 28 insertions(+), 54 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 81acf041f0..b84ec6d072 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2017-10-24 Ulrich Weigand + + * i387-tdep.c (print_i387_value): Use floatformat_to_string. + * sh64-tdep.c (sh64_do_fp_register): Likewise. + * mips-tdep.c (mips_print_fp_register): Likewise. + 2017-10-24 Ulrich Weigand * common/format.h (enum argclass): Replace decfloat_arg by diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index 3de7c62f4a..85c969aaff 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -36,23 +36,14 @@ static void print_i387_value (struct gdbarch *gdbarch, const gdb_byte *raw, struct ui_file *file) { - DOUBLEST value; - - /* Using extract_typed_floating here might affect the representation - of certain numbers such as NaNs, even if GDB is running natively. - This is fine since our caller already detects such special - numbers and we print the hexadecimal representation anyway. */ - value = extract_typed_floating (raw, i387_ext_type (gdbarch)); - /* We try to print 19 digits. The last digit may or may not contain garbage, but we'd better print one too many. We need enough room to print the value, 1 position for the sign, 1 for the decimal point, 19 for the digits and 6 for the exponent adds up to 27. */ -#ifdef PRINTF_HAS_LONG_DOUBLE - fprintf_filtered (file, " %-+27.19Lg", (long double) value); -#else - fprintf_filtered (file, " %-+27.19g", (double) value); -#endif + const struct floatformat *fmt + = floatformat_from_type (i387_ext_type (gdbarch)); + std::string str = floatformat_to_string (fmt, raw, " %-+27.19g"); + fprintf_filtered (file, "%s", str.c_str ()); } /* Print the classification for the register contents RAW. */ diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 4eafe3e308..61e7295643 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -6256,8 +6256,12 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame, { /* Do values for FP (float) regs. */ struct gdbarch *gdbarch = get_frame_arch (frame); gdb_byte *raw_buffer; - double doub, flt1; /* Doubles extracted from raw hex data. */ - int inv1, inv2; + std::string flt_str, dbl_str; + + const struct floatformat *flt_fmt + = floatformat_from_type (builtin_type (gdbarch)->builtin_float); + const struct floatformat *dbl_fmt + = floatformat_from_type (builtin_type (gdbarch)->builtin_double); raw_buffer = ((gdb_byte *) @@ -6275,31 +6279,21 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame, /* 4-byte registers: Print hex and floating. Also print even numbered registers as doubles. */ mips_read_fp_register_single (frame, regnum, raw_buffer); - flt1 = unpack_double (builtin_type (gdbarch)->builtin_float, - raw_buffer, &inv1); + flt_str = floatformat_to_string (flt_fmt, raw_buffer, "%-17.9g"); get_formatted_print_options (&opts, 'x'); print_scalar_formatted (raw_buffer, builtin_type (gdbarch)->builtin_uint32, &opts, 'w', file); - fprintf_filtered (file, " flt: "); - if (inv1) - fprintf_filtered (file, " "); - else - fprintf_filtered (file, "%-17.9g", flt1); + fprintf_filtered (file, " flt: %s", flt_str.c_str ()); if ((regnum - gdbarch_num_regs (gdbarch)) % 2 == 0) { mips_read_fp_register_double (frame, regnum, raw_buffer); - doub = unpack_double (builtin_type (gdbarch)->builtin_double, - raw_buffer, &inv2); + dbl_str = floatformat_to_string (dbl_fmt, raw_buffer, "%-24.17g"); - fprintf_filtered (file, " dbl: "); - if (inv2) - fprintf_filtered (file, ""); - else - fprintf_filtered (file, "%-24.17g", doub); + fprintf_filtered (file, " dbl: %s", dbl_str.c_str ()); } } else @@ -6308,29 +6302,18 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame, /* Eight byte registers: print each one as hex, float and double. */ mips_read_fp_register_single (frame, regnum, raw_buffer); - flt1 = unpack_double (builtin_type (gdbarch)->builtin_float, - raw_buffer, &inv1); + flt_str = floatformat_to_string (flt_fmt, raw_buffer, "%-17.9g"); mips_read_fp_register_double (frame, regnum, raw_buffer); - doub = unpack_double (builtin_type (gdbarch)->builtin_double, - raw_buffer, &inv2); + dbl_str = floatformat_to_string (dbl_fmt, raw_buffer, "%-24.17g"); get_formatted_print_options (&opts, 'x'); print_scalar_formatted (raw_buffer, builtin_type (gdbarch)->builtin_uint64, &opts, 'g', file); - fprintf_filtered (file, " flt: "); - if (inv1) - fprintf_filtered (file, ""); - else - fprintf_filtered (file, "%-17.9g", flt1); - - fprintf_filtered (file, " dbl: "); - if (inv2) - fprintf_filtered (file, ""); - else - fprintf_filtered (file, "%-24.17g", doub); + fprintf_filtered (file, " flt: %s", flt_str.c_str ()); + fprintf_filtered (file, " dbl: %s", dbl_str.c_str ()); } } diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c index 586490b149..ac216232b8 100644 --- a/gdb/sh64-tdep.c +++ b/gdb/sh64-tdep.c @@ -1915,8 +1915,6 @@ sh64_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum) { /* Do values for FP (float) regs. */ unsigned char *raw_buffer; - double flt; /* Double extracted from raw hex data. */ - int inv; /* Allocate space for the float. */ raw_buffer = (unsigned char *) @@ -1927,20 +1925,16 @@ sh64_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file, error (_("can't read register %d (%s)"), regnum, gdbarch_register_name (gdbarch, regnum)); - /* Get the register as a number. */ - flt = unpack_double (builtin_type (gdbarch)->builtin_float, - raw_buffer, &inv); - /* Print the name and some spaces. */ fputs_filtered (gdbarch_register_name (gdbarch, regnum), file); print_spaces_filtered (15 - strlen (gdbarch_register_name (gdbarch, regnum)), file); /* Print the value. */ - if (inv) - fprintf_filtered (file, ""); - else - fprintf_filtered (file, "%-10.9g", flt); + const struct floatformat *fmt + = floatformat_from_type (builtin_type (gdbarch)->builtin_float); + std::string str = floatformat_to_string (fmt, raw_buffer, "%-10.9g"); + fprintf_filtered (file, "%s", str.c_str ()); /* Print the fp register as hex. */ fprintf_filtered (file, "\t(raw "); -- 2.34.1