From patchwork Tue Sep 5 18:20:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Weigand X-Patchwork-Id: 22632 Received: (qmail 52337 invoked by alias); 5 Sep 2017 18:20:53 -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 52294 invoked by uid 89); 5 Sep 2017 18:20:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=Integral 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:20:47 +0000 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v85IJCYq033392 for ; Tue, 5 Sep 2017 14:20:46 -0400 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0a-001b2d01.pphosted.com with ESMTP id 2csx6d8wya-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 05 Sep 2017 14:20:45 -0400 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 Sep 2017 19:20:43 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp15.uk.ibm.com (192.168.101.145) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 5 Sep 2017 19:20:41 +0100 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v85IKeIa9175268 for ; Tue, 5 Sep 2017 18:20:40 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 034AE52043 for ; Tue, 5 Sep 2017 18:15:59 +0100 (BST) Received: from oc3748833570.ibm.com (unknown [9.164.150.234]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id DAD0F5203F for ; Tue, 5 Sep 2017 18:15:58 +0100 (BST) Received: by oc3748833570.ibm.com (Postfix, from userid 1000) id 13FE8D8086F; Tue, 5 Sep 2017 20:20:40 +0200 (CEST) Subject: [RFC][02/19] Target FP: Simplify floatformat_from_type To: gdb-patches@sourceware.org Date: Tue, 5 Sep 2017 20:20:40 +0200 (CEST) From: "Ulrich Weigand" MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17090518-0020-0000-0000-000003B3CD9E X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17090518-0021-0000-0000-00004244382C Message-Id: <20170905182040.13FE8D8086F@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][02/19] Target FP: Simplify floatformat_from_type For historical reasons, the TYPE_FLOATFORMAT element is still set to hold an array of two floatformat structs, one for big-endian and the other for little-endian. When accessing the element via floatformat_from_type, the code would check the type's byte order and return the appropriate floatformat. However, these days this is quite unnecessary, since the type's byte order is already known at the time the type is allocated and the floatformat is installed into TYPE_FLOATFORMAT. Therefore, we can just install the correct version here. Also, moved the (now trivially simple) floatformat_from_type accessor to gdbtypes.{c,h}, since it doesn't really need to be in doublest.c now. Bye, Ulrich ChangeLog: * doublest.h (floatformat_from_type): Move to gdbtypes.h. * doublest.c (floatformat_from_type): Move to gdbtypes.c. * gdbtypes.h (union type_specific): Make field floatformat hold just a single struct floatformat, not an array. (floatformat_from_type): Move here. * gdbtypes.c (floatformat_from_type): Move here. Update to changed TYPE_FLOATFORMAT definition. (verify_floatformat): Update to changed TYPE_FLOATFORMAT. (recursive_dump_type): Likewise. (init_float_type): Install correct floatformat for byte order. (arch_float_type): Likewise. Index: binutils-gdb/gdb/doublest.c =================================================================== --- binutils-gdb.orig/gdb/doublest.c +++ binutils-gdb/gdb/doublest.c @@ -770,22 +770,6 @@ floatformat_from_doublest (const struct } -/* Return the floating-point format for a floating-point variable of - type TYPE. */ - -const struct floatformat * -floatformat_from_type (const struct type *type) -{ - struct gdbarch *gdbarch = get_type_arch (type); - const struct floatformat *fmt; - - gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT); - gdb_assert (TYPE_FLOATFORMAT (type)); - fmt = TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)]; - gdb_assert (TYPE_LENGTH (type) >= floatformat_totalsize_bytes (fmt)); - return fmt; -} - /* Extract a floating-point number of type TYPE from a target-order byte-stream at ADDR. Returns the value as type DOUBLEST. */ Index: binutils-gdb/gdb/doublest.h =================================================================== --- binutils-gdb.orig/gdb/doublest.h +++ binutils-gdb/gdb/doublest.h @@ -71,12 +71,6 @@ extern enum float_kind floatformat_class extern const char *floatformat_mantissa (const struct floatformat *, const bfd_byte *); -/* Given TYPE, return its floatformat. TYPE_FLOATFORMAT() may return - NULL. type_floatformat() detects that and returns a floatformat - based on the type size when FLOATFORMAT is NULL. */ - -const struct floatformat *floatformat_from_type (const struct type *type); - /* Return the floatformat's total size in host bytes. */ extern size_t floatformat_totalsize_bytes (const struct floatformat *fmt); Index: binutils-gdb/gdb/gdbtypes.c =================================================================== --- binutils-gdb.orig/gdb/gdbtypes.c +++ binutils-gdb/gdb/gdbtypes.c @@ -2735,22 +2735,31 @@ set_type_code (struct type *type, enum t determined by the floatformat. Returns size to be used. */ static int -verify_floatformat (int bit, const struct floatformat **floatformats) +verify_floatformat (int bit, const struct floatformat *floatformat) { - gdb_assert (floatformats != NULL); - gdb_assert (floatformats[0] != NULL && floatformats[1] != NULL); + gdb_assert (floatformat != NULL); if (bit == -1) - bit = floatformats[0]->totalsize; + bit = floatformat->totalsize; gdb_assert (bit >= 0); size_t len = bit / TARGET_CHAR_BIT; - gdb_assert (len >= floatformat_totalsize_bytes (floatformats[0])); - gdb_assert (len >= floatformat_totalsize_bytes (floatformats[1])); + gdb_assert (len * TARGET_CHAR_BIT >= floatformat->totalsize); return bit; } +/* Return the floating-point format for a floating-point variable of + type TYPE. */ + +const struct floatformat * +floatformat_from_type (const struct type *type) +{ + gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT); + gdb_assert (TYPE_FLOATFORMAT (type)); + return TYPE_FLOATFORMAT (type); +} + /* Helper function to initialize the standard scalar types. If NAME is non-NULL, then it is used to initialize the type name. @@ -2842,11 +2851,13 @@ init_float_type (struct objfile *objfile int bit, const char *name, const struct floatformat **floatformats) { + struct gdbarch *gdbarch = get_objfile_arch (objfile); + const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)]; struct type *t; - bit = verify_floatformat (bit, floatformats); + bit = verify_floatformat (bit, fmt); t = init_type (objfile, TYPE_CODE_FLT, bit / TARGET_CHAR_BIT, name); - TYPE_FLOATFORMAT (t) = floatformats; + TYPE_FLOATFORMAT (t) = fmt; return t; } @@ -4544,26 +4555,11 @@ recursive_dump_type (struct type *type, case TYPE_SPECIFIC_FLOATFORMAT: printfi_filtered (spaces, "floatformat "); - if (TYPE_FLOATFORMAT (type) == NULL) + if (TYPE_FLOATFORMAT (type) == NULL + || TYPE_FLOATFORMAT (type)->name == NULL) puts_filtered ("(null)"); else - { - puts_filtered ("{ "); - if (TYPE_FLOATFORMAT (type)[0] == NULL - || TYPE_FLOATFORMAT (type)[0]->name == NULL) - puts_filtered ("(null)"); - else - puts_filtered (TYPE_FLOATFORMAT (type)[0]->name); - - puts_filtered (", "); - if (TYPE_FLOATFORMAT (type)[1] == NULL - || TYPE_FLOATFORMAT (type)[1]->name == NULL) - puts_filtered ("(null)"); - else - puts_filtered (TYPE_FLOATFORMAT (type)[1]->name); - - puts_filtered (" }"); - } + puts_filtered (TYPE_FLOATFORMAT (type)->name); puts_filtered ("\n"); break; @@ -4907,11 +4903,12 @@ arch_float_type (struct gdbarch *gdbarch int bit, const char *name, const struct floatformat **floatformats) { + const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)]; struct type *t; - bit = verify_floatformat (bit, floatformats); + bit = verify_floatformat (bit, fmt); t = arch_type (gdbarch, TYPE_CODE_FLT, bit / TARGET_CHAR_BIT, name); - TYPE_FLOATFORMAT (t) = floatformats; + TYPE_FLOATFORMAT (t) = fmt; return t; } Index: binutils-gdb/gdb/gdbtypes.h =================================================================== --- binutils-gdb.orig/gdb/gdbtypes.h +++ binutils-gdb/gdb/gdbtypes.h @@ -571,12 +571,11 @@ union type_specific struct gnat_aux_type *gnat_stuff; - /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to two - floatformat objects that describe the floating-point value - that resides within the type. The first is for big endian - targets and the second is for little endian targets. */ + /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to a + floatformat object that describes the floating-point value + that resides within the type. */ - const struct floatformat **floatformat; + const struct floatformat *floatformat; /* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */ @@ -1434,6 +1433,9 @@ extern void set_type_vptr_basetype (stru #define TYPE_ERROR_NAME(type) \ (TYPE_NAME (type) ? TYPE_NAME (type) : _("")) +/* Given TYPE, return its floatformat. */ +const struct floatformat *floatformat_from_type (const struct type *type); + struct builtin_type { /* Integral types. */