[RFA 5/6] Make function fixed_point_scaling_factor a method of struct type

Joel Brobecker
2020-11-15T08:50:00Z

This logically connects this function to the object it inspects.

gdb/ChangeLog:

* gdbtypes.h (struct type) <fixed_point_scaling_factor>: 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 0dd3b1c..a3fc9cc 100644
--- a/gdb/typeprint.c
+++ b/gdb/typeprint.c
@@ -667,7 +667,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 <const gdb_byte> (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 <const gdb_byte> (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 <gdb_byte> (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<const gdb_byte> (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<const gdb_byte> (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<const gdb_byte> (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