From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 2BZUIcjLsF+/NwAAWB0awg (envelope-from ) for ; Sun, 15 Nov 2020 01:33:44 -0500 Received: by simark.ca (Postfix, from userid 112) id 86E091F08B; Sun, 15 Nov 2020 01:33:44 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id EB5D31E58D for ; Sun, 15 Nov 2020 01:33:43 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 95B253857C65; Sun, 15 Nov 2020 06:33:43 +0000 (GMT) Received: from rock.gnat.com (rock.gnat.com [IPv6:2620:20:4000:0:a9e:1ff:fe9b:1d1]) by sourceware.org (Postfix) with ESMTP id 7759D3857C65 for ; Sun, 15 Nov 2020 06:33:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7759D3857C65 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=brobecker@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 23A2756046; Sun, 15 Nov 2020 01:33:38 -0500 (EST) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id JidV8v7GaiVD; Sun, 15 Nov 2020 01:33:38 -0500 (EST) Received: from float.home (localhost.localdomain [127.0.0.1]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPS id B737F116FC1; Sun, 15 Nov 2020 01:33:37 -0500 (EST) Received: by float.home (Postfix, from userid 1000) id 2B0BFA1870; Sun, 15 Nov 2020 10:33:32 +0400 (+04) Date: Sun, 15 Nov 2020 10:33:32 +0400 From: Joel Brobecker To: Simon Marchi Subject: Re: [PATCH 5/9] Add support for printing value of DWARF-based fixed-point type objects Message-ID: <20201115063332.GD404828@adacore.com> References: <1604817017-25807-1-git-send-email-brobecker@adacore.com> <1604817017-25807-6-git-send-email-brobecker@adacore.com> <2d12525a-3a85-3f69-bfea-22166f7fd358@simark.ca> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="JgQwtEuHJzHdouWu" Content-Disposition: inline In-Reply-To: <2d12525a-3a85-3f69-bfea-22166f7fd358@simark.ca> X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: GDB patches Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" --JgQwtEuHJzHdouWu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Simon, > > +/* Given TYPE, which is a fixed point type, return its scaling factor. */ > > +extern const gdb_mpq &fixed_point_scaling_factor (struct type *type); > > I think this would belong in fixed_point_type_info, so you'd access it > using: > > type->fixed_point_info ().scaling_factor () In pratice, this wouldn't work. The main reason-d'etre for this function is that fixed point types can be both a TYPE_CODE_FIXED_POINT as well as a TYPE_CODE_RANGE of a TYPE_CODE_FIXED_POINT. What the function above does is first call fixed_point_type_base_type in order to get to the type which actually has the fixed_point_info, and then from there accesses the scaling factor. What we can do is make that a method of struct type instead... This is what the attached patch does. -- Joel --JgQwtEuHJzHdouWu Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-Make-function-fixed_point_scaling_factor-a-method-of.patch" >From 15721d0ee30f77ce8c3abb0c9469c015a37856cd Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Sun, 15 Nov 2020 01:21:37 -0500 Subject: [PATCH] Make function fixed_point_scaling_factor a method of struct type This logically connects this function to the object it inspects. gdb/ChangeLog: * gdbtypes.h (struct type) : New method, replacing fixed_point_scaling_factor. All callers updated throughout this project. (fixed_point_scaling_factor): Delete declaration. * gdbtypes.c (type::fixed_point_scaling_factor): Replaces fixed_point_scaling_factor. Adjust implementation accordingly. --- gdb/gdbtypes.c | 6 +++--- gdb/gdbtypes.h | 8 +++++--- gdb/typeprint.c | 2 +- gdb/valarith.c | 6 +++--- gdb/valops.c | 6 +++--- gdb/valprint.c | 2 +- gdb/value.c | 2 +- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index eb176c9..79c8121 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -4922,7 +4922,7 @@ static void print_fixed_point_type_info (struct type *type, int spaces) { printfi_filtered (spaces + 2, "scaling factor: %s\n", - fixed_point_scaling_factor (type).str ().c_str ()); + type->fixed_point_scaling_factor ().str ().c_str ()); } static struct obstack dont_print_type_obstack; @@ -5876,9 +5876,9 @@ type::fixed_point_type_base_type () /* See gdbtypes.h. */ const gdb_mpq & -fixed_point_scaling_factor (struct type *type) +type::fixed_point_scaling_factor () { - type = type->fixed_point_type_base_type (); + struct type *type = this->fixed_point_type_base_type (); return type->fixed_point_info ().scaling_factor; } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 19f95f4..dc37f63 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1224,6 +1224,11 @@ struct type struct type *fixed_point_type_base_type (); + /* * Assuming that THIS is a TYPE_CODE_FIXED_POINT, return its scaling + factor. */ + + const gdb_mpq &fixed_point_scaling_factor (); + /* * Return the dynamic property of the requested KIND from this type's list of dynamic properties. */ dynamic_prop *dyn_prop (dynamic_prop_node_kind kind) const; @@ -2589,9 +2594,6 @@ extern int type_not_associated (const struct type *type); a range type whose base type is a TYPE_CODE_FIXED_POINT. */ extern bool is_fixed_point_type (struct type *type); -/* Given TYPE, which is a fixed point type, return its scaling factor. */ -extern const gdb_mpq &fixed_point_scaling_factor (struct type *type); - /* Allocate a fixed-point type info for TYPE. This should only be called by INIT_FIXED_POINT_SPECIFIC. */ extern void allocate_fixed_point_type_info (struct type *type); diff --git a/gdb/typeprint.c b/gdb/typeprint.c index 6eedb5d..e85b736 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -668,7 +668,7 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream) void print_type_fixed_point (struct type *type, struct ui_file *stream) { - std::string small_img = fixed_point_scaling_factor (type).str (); + std::string small_img = type->fixed_point_scaling_factor ().str (); fprintf_filtered (stream, "%s-byte fixed point (small = %s)", pulongest (TYPE_LENGTH (type)), small_img.c_str ()); diff --git a/gdb/valarith.c b/gdb/valarith.c index 8c47249..1c6ef2c 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -911,11 +911,11 @@ fixed_point_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) v1.read_fixed_point (gdb::array_view (value_contents (arg1), TYPE_LENGTH (type1)), type_byte_order (type1), type1->is_unsigned (), - fixed_point_scaling_factor (type1)); + type1->fixed_point_scaling_factor ()); v2.read_fixed_point (gdb::array_view (value_contents (arg2), TYPE_LENGTH (type2)), type_byte_order (type2), type2->is_unsigned (), - fixed_point_scaling_factor (type2)); + type2->fixed_point_scaling_factor ()); #define INIT_VAL_WITH_FIXED_POINT_VAL(RESULT) \ do { \ @@ -924,7 +924,7 @@ fixed_point_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) (gdb::array_view (value_contents_raw (val), \ TYPE_LENGTH (type1)), \ type_byte_order (type1), type1->is_unsigned (), \ - fixed_point_scaling_factor (type1)); \ + type1->fixed_point_scaling_factor ()); \ } while (0) switch (op) diff --git a/gdb/valops.c b/gdb/valops.c index b4c6d88..bfddf62 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -363,7 +363,7 @@ value_cast_to_fixed_point (struct type *to_type, struct value *from_val) mpq_set_z (vq.val, vz.val); if (is_fixed_point_type (from_type)) - mpq_mul (vq.val, vq.val, fixed_point_scaling_factor (from_type).val); + mpq_mul (vq.val, vq.val, from_type->fixed_point_scaling_factor ().val); } else @@ -373,7 +373,7 @@ value_cast_to_fixed_point (struct type *to_type, struct value *from_val) /* Divide that value by the scaling factor to obtain the unscaled value, first in rational form, and then in integer form. */ - mpq_div (vq.val, vq.val, fixed_point_scaling_factor (to_type).val); + mpq_div (vq.val, vq.val, to_type->fixed_point_scaling_factor ().val); gdb_mpz unscaled = vq.get_rounded (); /* Finally, create the result value, and pack the unscaled value @@ -528,7 +528,7 @@ value_cast (struct type *type, struct value *arg2) (gdb::array_view (value_contents (arg2), TYPE_LENGTH (type2)), type_byte_order (type2), type2->is_unsigned (), - fixed_point_scaling_factor (type2)); + type2->fixed_point_scaling_factor ()); struct value *v = allocate_value (to_type); target_float_from_host_double (value_contents_raw (v), diff --git a/gdb/valprint.c b/gdb/valprint.c index 66f8de9..0d66ed4 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -812,7 +812,7 @@ generic_val_print_fixed_point (struct value *val, struct ui_file *stream, f.read_fixed_point (gdb::array_view (valaddr, TYPE_LENGTH (type)), type_byte_order (type), type->is_unsigned (), - fixed_point_scaling_factor (type)); + type->fixed_point_scaling_factor ()); const char *fmt = TYPE_LENGTH (type) < 4 ? "%.11Fg" : "%.17Fg"; std::string str = gmp_string_asprintf (fmt, f.val); diff --git a/gdb/value.c b/gdb/value.c index f3f5169..0b3d463 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2814,7 +2814,7 @@ unpack_long (struct type *type, const gdb_byte *valaddr) gdb_mpq vq; vq.read_fixed_point (gdb::array_view (valaddr, len), byte_order, nosign, - fixed_point_scaling_factor (type)); + type->fixed_point_scaling_factor ()); gdb_mpz vz; mpz_tdiv_q (vz.val, mpq_numref (vq.val), mpq_denref (vq.val)); -- 2.1.4 --JgQwtEuHJzHdouWu--