From patchwork Tue Sep 5 18:21:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Weigand X-Patchwork-Id: 22640 Received: (qmail 57200 invoked by alias); 5 Sep 2017 18:21:34 -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 57151 invoked by uid 89); 5 Sep 2017 18:21:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.7 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=cha X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Sep 2017 18:21:27 +0000 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v85IJ5Qn140480 for ; Tue, 5 Sep 2017 14:21:26 -0400 Received: from e06smtp11.uk.ibm.com (e06smtp11.uk.ibm.com [195.75.94.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 2csvhyeh0w-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 05 Sep 2017 14:21:26 -0400 Received: from localhost by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 Sep 2017 19:21:23 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 5 Sep 2017 19:21:21 +0100 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v85ILK8513828346 for ; Tue, 5 Sep 2017 18:21:20 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5DEC8AE056 for ; Tue, 5 Sep 2017 19:16:37 +0100 (BST) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 36988AE051 for ; Tue, 5 Sep 2017 19:16:37 +0100 (BST) Received: from oc3748833570.ibm.com (unknown [9.164.150.234]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP for ; Tue, 5 Sep 2017 19:16:37 +0100 (BST) Received: by oc3748833570.ibm.com (Postfix, from userid 1000) id 48E93D8086F; Tue, 5 Sep 2017 20:21:20 +0200 (CEST) Subject: [RFC][10/19] Target FP: Add string routines to target-float.{c,h} To: gdb-patches@sourceware.org Date: Tue, 5 Sep 2017 20:21:20 +0200 (CEST) From: "Ulrich Weigand" MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17090518-0040-0000-0000-000003F5CC3A X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17090518-0041-0000-0000-00002096442E Message-Id: <20170905182120.48E93D8086F@oc3748833570.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-09-05_07:, , 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-1709050267 [RFC][10/19] 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 (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. * 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, + 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, + 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" @@ -1376,18 +1375,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); - std::string 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" @@ -2359,13 +2359,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/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" @@ -1364,13 +1363,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 @@ -800,19 +800,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 @@ -22,6 +22,7 @@ #include "selftest.h" #include "selftest-arch.h" #include "inferior.h" +#include "target-float.h" namespace selftests { @@ -105,11 +106,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 {