From patchwork Wed Oct 25 16:16:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Weigand X-Patchwork-Id: 23811 Received: (qmail 89764 invoked by alias); 25 Oct 2017 16:16:47 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 89731 invoked by uid 89); 25 Oct 2017 16:16:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=Eight X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0b-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.158.5) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 25 Oct 2017 16:16:43 +0000 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v9PGACJ5113642 for ; Wed, 25 Oct 2017 12:16:42 -0400 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0b-001b2d01.pphosted.com with ESMTP id 2dtw3rawwy-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 25 Oct 2017 12:16:41 -0400 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 25 Oct 2017 17:16:39 +0100 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 25 Oct 2017 17:16:37 +0100 Received: from d06av24.portsmouth.uk.ibm.com (d06av24.portsmouth.uk.ibm.com [9.149.105.60]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v9PGGbZu27263230 for ; Wed, 25 Oct 2017 16:16:37 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F1BF042045 for ; Wed, 25 Oct 2017 17:11:59 +0100 (BST) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D7EA542041 for ; Wed, 25 Oct 2017 17:11:59 +0100 (BST) Received: from oc3748833570.ibm.com (unknown [9.152.213.178]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP for ; Wed, 25 Oct 2017 17:11:59 +0100 (BST) Received: by oc3748833570.ibm.com (Postfix, from userid 1000) id E7F60D807F1; Wed, 25 Oct 2017 18:16:36 +0200 (CEST) Subject: [RFC v2][2/9] Target FP: Add string routines to target-float.{c,h} To: gdb-patches@sourceware.org Date: Wed, 25 Oct 2017 18:16:36 +0200 (CEST) From: "Ulrich Weigand" MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17102516-0016-0000-0000-000004F9CDC0 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17102516-0017-0000-0000-00002835443F Message-Id: <20171025161636.E7F60D807F1@oc3748833570.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-10-25_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000 definitions=main-1710250214 [RFC v2][2/9] Target FP: Add string routines to target-float.{c,h} This adds target_float_to_string and target_float_from_string, which dispatch to the corresponding floatformat_ or decimal_ routines. Existing users of those routines are changed to use the new target-float routines instead (most of those places already handle both binary and decimal FP). In addition, two other places are changes to use target_float_from_string: - define_symbol in stabsread.c, when parsing a floating-point literal from stabs debug info - gdbarch-selftest.c when initializing a target format values (to eliminate use of DOUBLEST there). Bye, Ulrich ChangeLog: * target-float.c (target_float_to_string): New function. (target_float_from_string): New function. * target-float.h (target_float_to_string): Add prototype. (target_float_from_string): Add prototype. * valprint.c: Include "target-float.h". Do not include "doublest.h" and "dfp.h". (print_floating): Use target_float_to_string. * printcmd.c: Include "target-float.h". Do not include "dfp.h". (printf_floating): Use target_float_to_string. * i387-tdep.c: Include "target-float.h". Do not include "doublest.h". (print_i387_value): Use target_float_to_string. * mips-tdep.c: Include "target-float.h". (mips_print_fp_register): Use target_float_to_string. * sh64-tdep.c: Include "target-float.h". (sh64_do_fp_register): Use target_float_to_string. * parse.c: Include "target-float.h". Do not include "doublest.h" and "dfp.h". (parse_float): Use target_float_from_string. * stabsread.c: Include "target-float.h". Do not include "doublest.h". (define_symbol): Use target_float_from_string. * gdbarch-selftests.c: Include "target-float.h". (register_to_value_test): Use target_float_from_string. Index: binutils-gdb/gdb/target-float.c =================================================================== --- binutils-gdb.orig/gdb/target-float.c +++ binutils-gdb/gdb/target-float.c @@ -60,3 +60,40 @@ target_float_is_zero (const gdb_byte *ad gdb_assert_not_reached ("unexpected type code"); } +/* Convert the byte-stream ADDR, interpreted as floating-point type TYPE, + to a string, optionally using the print format FORMAT. */ +std::string +target_float_to_string (const gdb_byte *addr, const struct type *type, + const char *format) +{ + if (TYPE_CODE (type) == TYPE_CODE_FLT) + return floatformat_to_string (floatformat_from_type (type), addr, format); + + if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT) + return decimal_to_string (addr, TYPE_LENGTH (type), + gdbarch_byte_order (get_type_arch (type)), + format); + + gdb_assert_not_reached ("unexpected type code"); +} + +/* Parse string STRING into a target floating-number of type TYPE and + store it as byte-stream ADDR. Return whether parsing succeeded. */ +bool +target_float_from_string (gdb_byte *addr, const struct type *type, + const std::string &string) +{ + /* Ensure possible padding bytes in the target buffer are zeroed out. */ + memset (addr, 0, TYPE_LENGTH (type)); + + if (TYPE_CODE (type) == TYPE_CODE_FLT) + return floatformat_from_string (floatformat_from_type (type), addr, + string); + + if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT) + return decimal_from_string (addr, TYPE_LENGTH (type), + gdbarch_byte_order (get_type_arch (type)), + string); + + gdb_assert_not_reached ("unexpected type code"); +} Index: binutils-gdb/gdb/target-float.h =================================================================== --- binutils-gdb.orig/gdb/target-float.h +++ binutils-gdb/gdb/target-float.h @@ -25,4 +25,11 @@ extern bool target_float_is_valid (const extern bool target_float_is_zero (const gdb_byte *addr, const struct type *type); +extern std::string target_float_to_string (const gdb_byte *addr, + const struct type *type, + const char *format = nullptr); +extern bool target_float_from_string (gdb_byte *addr, + const struct type *type, + const std::string &string); + #endif Index: binutils-gdb/gdb/valprint.c =================================================================== --- binutils-gdb.orig/gdb/valprint.c +++ binutils-gdb/gdb/valprint.c @@ -27,8 +27,7 @@ #include "language.h" #include "annotate.h" #include "valprint.h" -#include "doublest.h" -#include "dfp.h" +#include "target-float.h" #include "extension.h" #include "ada-lang.h" #include "gdb_obstack.h" @@ -1366,18 +1365,7 @@ void print_floating (const gdb_byte *valaddr, struct type *type, struct ui_file *stream) { - std::string str; - if (TYPE_CODE (type) == TYPE_CODE_FLT) - { - const struct floatformat *fmt = floatformat_from_type (type); - str = floatformat_to_string (fmt, valaddr); - } - else - { - enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); - unsigned len = TYPE_LENGTH (type); - str = decimal_to_string (valaddr, len, byte_order); - } + std::string str = target_float_to_string (valaddr, type); fputs_filtered (str.c_str (), stream); } Index: binutils-gdb/gdb/printcmd.c =================================================================== --- binutils-gdb.orig/gdb/printcmd.c +++ binutils-gdb/gdb/printcmd.c @@ -38,7 +38,7 @@ #include "ui-out.h" #include "block.h" #include "disasm.h" -#include "dfp.h" +#include "target-float.h" #include "observer.h" #include "solist.h" #include "parser-defs.h" @@ -2360,13 +2360,8 @@ printf_floating (struct ui_file *stream, value = value_cast (fmt_type, value); /* Convert the value to a string and print it. */ - std::string str; - if (TYPE_CODE (fmt_type) == TYPE_CODE_FLT) - str = floatformat_to_string (floatformat_from_type (fmt_type), - value_contents (value), format); - else - str = decimal_to_string (value_contents (value), - TYPE_LENGTH (fmt_type), byte_order, format); + std::string str + = target_float_to_string (value_contents (value), fmt_type, format); fputs_filtered (str.c_str (), stream); } Index: binutils-gdb/gdb/i387-tdep.c =================================================================== --- binutils-gdb.orig/gdb/i387-tdep.c +++ binutils-gdb/gdb/i387-tdep.c @@ -18,12 +18,12 @@ along with this program. If not, see . */ #include "defs.h" -#include "doublest.h" #include "frame.h" #include "gdbcore.h" #include "inferior.h" #include "language.h" #include "regcache.h" +#include "target-float.h" #include "value.h" #include "i386-tdep.h" @@ -40,9 +40,8 @@ print_i387_value (struct gdbarch *gdbarc 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. */ - const struct floatformat *fmt - = floatformat_from_type (i387_ext_type (gdbarch)); - std::string str = floatformat_to_string (fmt, raw, " %-+27.19g"); + const struct type *type = i387_ext_type (gdbarch); + std::string str = target_float_to_string (raw, type, " %-+27.19g"); fprintf_filtered (file, "%s", str.c_str ()); } Index: binutils-gdb/gdb/mips-tdep.c =================================================================== --- binutils-gdb.orig/gdb/mips-tdep.c +++ binutils-gdb/gdb/mips-tdep.c @@ -55,6 +55,7 @@ #include "user-regs.h" #include "valprint.h" #include "ax.h" +#include "target-float.h" #include static const struct objfile_data *mips_pdr_data; @@ -6258,10 +6259,8 @@ mips_print_fp_register (struct ui_file * gdb_byte *raw_buffer; 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); + const struct type *flt_type = builtin_type (gdbarch)->builtin_float; + const struct type *dbl_type = builtin_type (gdbarch)->builtin_double; raw_buffer = ((gdb_byte *) @@ -6279,7 +6278,7 @@ mips_print_fp_register (struct ui_file * /* 4-byte registers: Print hex and floating. Also print even numbered registers as doubles. */ mips_read_fp_register_single (frame, regnum, raw_buffer); - flt_str = floatformat_to_string (flt_fmt, raw_buffer, "%-17.9g"); + flt_str = target_float_to_string (raw_buffer, flt_type, "%-17.9g"); get_formatted_print_options (&opts, 'x'); print_scalar_formatted (raw_buffer, @@ -6291,7 +6290,7 @@ mips_print_fp_register (struct ui_file * if ((regnum - gdbarch_num_regs (gdbarch)) % 2 == 0) { mips_read_fp_register_double (frame, regnum, raw_buffer); - dbl_str = floatformat_to_string (dbl_fmt, raw_buffer, "%-24.17g"); + dbl_str = target_float_to_string (raw_buffer, dbl_type, "%-24.17g"); fprintf_filtered (file, " dbl: %s", dbl_str.c_str ()); } @@ -6302,10 +6301,10 @@ mips_print_fp_register (struct ui_file * /* Eight byte registers: print each one as hex, float and double. */ mips_read_fp_register_single (frame, regnum, raw_buffer); - flt_str = floatformat_to_string (flt_fmt, raw_buffer, "%-17.9g"); + flt_str = target_float_to_string (raw_buffer, flt_type, "%-17.9g"); mips_read_fp_register_double (frame, regnum, raw_buffer); - dbl_str = floatformat_to_string (dbl_fmt, raw_buffer, "%-24.17g"); + dbl_str = target_float_to_string (raw_buffer, dbl_type, "%-24.17g"); get_formatted_print_options (&opts, 'x'); print_scalar_formatted (raw_buffer, Index: binutils-gdb/gdb/sh64-tdep.c =================================================================== --- binutils-gdb.orig/gdb/sh64-tdep.c +++ binutils-gdb/gdb/sh64-tdep.c @@ -35,6 +35,7 @@ #include "arch-utils.h" #include "regcache.h" #include "osabi.h" +#include "target-float.h" #include "valprint.h" #include "elf-bfd.h" @@ -1931,9 +1932,8 @@ sh64_do_fp_register (struct gdbarch *gdb (gdbarch, regnum)), file); /* Print the value. */ - const struct floatformat *fmt - = floatformat_from_type (builtin_type (gdbarch)->builtin_float); - std::string str = floatformat_to_string (fmt, raw_buffer, "%-10.9g"); + const struct type *flt_type = builtin_type (gdbarch)->builtin_float; + std::string str = target_float_to_string (raw_buffer, flt_type, "%-10.9g"); fprintf_filtered (file, "%s", str.c_str ()); /* Print the fp register as hex. */ Index: binutils-gdb/gdb/parse.c =================================================================== --- binutils-gdb.orig/gdb/parse.c +++ binutils-gdb/gdb/parse.c @@ -44,8 +44,7 @@ #include "gdbcmd.h" #include "symfile.h" /* for overlay functions */ #include "inferior.h" -#include "doublest.h" -#include "dfp.h" +#include "target-float.h" #include "block.h" #include "source.h" #include "objfiles.h" @@ -1338,13 +1337,7 @@ bool parse_float (const char *p, int len, const struct type *type, gdb_byte *data) { - if (TYPE_CODE (type) == TYPE_CODE_FLT) - return floatformat_from_string (floatformat_from_type (type), - data, std::string (p, len)); - else - return decimal_from_string (data, TYPE_LENGTH (type), - gdbarch_byte_order (get_type_arch (type)), - std::string (p, len)); + return target_float_from_string (data, type, std::string (p, len)); } /* Stuff for maintaining a stack of types. Currently just used by C, but Index: binutils-gdb/gdb/stabsread.c =================================================================== --- binutils-gdb.orig/gdb/stabsread.c +++ binutils-gdb/gdb/stabsread.c @@ -41,7 +41,7 @@ #include "demangle.h" #include "gdb-demangle.h" #include "language.h" -#include "doublest.h" +#include "target-float.h" #include "cp-abi.h" #include "cp-support.h" #include @@ -798,19 +798,15 @@ define_symbol (CORE_ADDR valu, const cha { case 'r': { - double d = atof (p); gdb_byte *dbl_valu; struct type *dbl_type; - /* FIXME-if-picky-about-floating-accuracy: Should be using - target arithmetic to get the value. real.c in GCC - probably has the necessary code. */ - dbl_type = objfile_type (objfile)->builtin_double; dbl_valu = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, TYPE_LENGTH (dbl_type)); - store_typed_floating (dbl_valu, dbl_type, d); + + target_float_from_string (dbl_valu, dbl_type, std::string (p)); SYMBOL_TYPE (sym) = dbl_type; SYMBOL_VALUE_BYTES (sym) = dbl_valu; Index: binutils-gdb/gdb/gdbarch-selftests.c =================================================================== --- binutils-gdb.orig/gdb/gdbarch-selftests.c +++ binutils-gdb/gdb/gdbarch-selftests.c @@ -24,6 +24,7 @@ #include "inferior.h" #include "gdbthread.h" #include "target.h" +#include "target-float.h" namespace selftests { @@ -178,11 +179,8 @@ register_to_value_test (struct gdbarch * if (TYPE_CODE (type) == TYPE_CODE_FLT) { - DOUBLEST d = 1.25; - /* Generate valid float format. */ - floatformat_from_doublest (floatformat_from_type (type), - &d, expected.data ()); + target_float_from_string (expected.data (), type, "1.25"); } else {