Add overload of fits_in_type
authorTom Tromey <tromey@adacore.com>
Mon, 27 Mar 2023 19:42:38 +0000 (13:42 -0600)
committerTom Tromey <tromey@adacore.com>
Mon, 17 Apr 2023 16:43:06 +0000 (10:43 -0600)
This adds an overload of fits_in_type that accepts a gdb_mpz.  A
subsequent patch will use this.

gdb/parse.c
gdb/parser-defs.h

index c0c9fa0a4489b8bc6cbdc366679196fc36c298c1..0588c0618c6d0f8da89f535d6ec3f85a81216863 100644 (file)
@@ -648,6 +648,32 @@ fits_in_type (int n_sign, ULONGEST n, int type_bits, bool type_signed_p)
   else
     gdb_assert_not_reached ("");
 }
+
+/* Return true if the number N_SIGN * N fits in a type with TYPE_BITS and
+   TYPE_SIGNED_P.  N_SIGNED is either 1 or -1.  */
+
+bool
+fits_in_type (int n_sign, const gdb_mpz &n, int type_bits, bool type_signed_p)
+{
+  /* N must be nonnegative.  */
+  gdb_assert (n.sgn () >= 0);
+
+  /* Zero always fits.  */
+  /* Normalize -0.  */
+  if (n.sgn () == 0)
+    return true;
+
+  if (n_sign == -1 && !type_signed_p)
+    /* Can't fit a negative number in an unsigned type.  */
+    return false;
+
+  gdb_mpz max = gdb_mpz::pow (2, (type_signed_p
+                                 ? type_bits - 1
+                                 : type_bits));
+  if (n_sign == -1)
+    return n <= max;
+  return n < max;
+}
 \f
 /* This function avoids direct calls to fprintf 
    in the parser generated debug code.  */
index 1780d85674427f768e1db5f82944541e4651b3fc..62829a86f9acba69045aa43972750df833bc9ff9 100644 (file)
@@ -414,6 +414,8 @@ extern bool parse_float (const char *p, int len,
                         const struct type *type, gdb_byte *data);
 extern bool fits_in_type (int n_sign, ULONGEST n, int type_bits,
                          bool type_signed_p);
+extern bool fits_in_type (int n_sign, const gdb_mpz &n, int type_bits,
+                         bool type_signed_p);
 \f
 
 /* Function used to avoid direct calls to fprintf