Add overload of fits_in_type

This adds an overload of fits_in_type that accepts a gdb_mpz.  A
subsequent patch will use this.
This commit is contained in:
Tom Tromey
2023-03-27 13:42:38 -06:00
parent d760ae22b9
commit 64f33c6938
2 changed files with 28 additions and 0 deletions

View 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;
}
/* This function avoids direct calls to fprintf
in the parser generated debug code. */

View 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);
/* Function used to avoid direct calls to fprintf