28 int size = gmp_vsnprintf (NULL, 0, fmt, vp);
31 std::string str (
size,
'\0');
36 gmp_vsprintf (&str[0], fmt, vp);
45gdb_mpz::read (gdb::array_view<const gdb_byte> buf,
enum bfd_endian byte_order,
48 mpz_import (
val, 1 , -1 , buf.size () ,
49 byte_order == BFD_ENDIAN_BIG ? 1 : -1 ,
59 mpz_ui_pow_ui (max.
val, 2, buf.size () * HOST_CHAR_BIT - 1);
60 if (mpz_cmp (
val, max.
val) >= 0)
61 mpz_submul_ui (
val, max.
val, 2);
69 bool unsigned_p)
const
72 (buf, byte_order == BFD_ENDIAN_BIG ? 1 : -1 , unsigned_p);
79 int endian,
bool unsigned_p)
const
81 gdb_assert (buf.size () > 0);
83 if (mpz_sgn (
val) == 0)
89 memset (buf.data (), 0, buf.size ());
97 const size_t max_usable_bits = buf.size () * HOST_CHAR_BIT;
102 mpz_ui_pow_ui (hi.
val, 2, max_usable_bits);
103 mpz_sub_ui (hi.
val, hi.
val, 1);
107 mpz_ui_pow_ui (lo.
val, 2, max_usable_bits - 1);
110 mpz_ui_pow_ui (hi.
val, 2, max_usable_bits - 1);
111 mpz_sub_ui (hi.
val, hi.
val, 1);
114 if (mpz_cmp (
val, lo.
val) < 0 || mpz_cmp (
val, hi.
val) > 0)
115 error (_(
"Cannot export value %s as %zu-bits %s integer"
116 " (must be between %s and %s)"),
117 this->
str ().c_str (),
119 unsigned_p ? _(
"unsigned") : _(
"signed"),
125 if (mpz_cmp_ui (exported_val.val, 0) < 0)
132 mpz_ui_pow_ui (neg_offset.
val, 2, buf.size () * HOST_CHAR_BIT);
133 mpz_add (exported_val.val, exported_val.val, neg_offset.
val);
147 gdb::unique_xmalloc_ptr<void> exported
148 (mpz_export (NULL, &word_countp, -1 , buf.size () ,
149 endian, 0 , exported_val.val));
151 gdb_assert (word_countp == 1);
153 memcpy (buf.data (), exported.get (), buf.size ());
165 mpq_abs (abs_val.
val, abs_val.
val);
172 mpz_fdiv_qr (quotient.
val, remainder.
val,
173 mpq_numref (abs_val.
val), mpq_denref (abs_val.
val));
178 mpz_mul_ui (remainder.
val, remainder.
val, 2);
179 if (mpz_cmp (remainder.
val, mpq_denref (abs_val.
val)) >= 0)
180 mpz_add_ui (quotient.
val, quotient.
val, 1);
183 if (mpq_sgn (
val) < 0)
184 mpz_neg (quotient.
val, quotient.
val);
193 enum bfd_endian byte_order,
bool unsigned_p,
197 vz.
read (buf, byte_order, unsigned_p);
207 enum bfd_endian byte_order,
bool unsigned_p,
208 const gdb_mpq &scaling_factor)
const
212 mpq_div (unscaled.
val, unscaled.
val, scaling_factor.
val);
215 unscaled_z.
write (buf, byte_order, unsigned_p);
void * xrealloc(void *ptr, size_t size)
std::string gmp_string_printf(const char *fmt,...)
static void xfree_for_gmp(void *ptr, size_t size)
void _initialize_gmp_utils()
static void * xrealloc_for_gmp(void *ptr, size_t old_size, size_t new_size)
void write_fixed_point(gdb::array_view< gdb_byte > buf, enum bfd_endian byte_order, bool unsigned_p, const gdb_mpq &scaling_factor) const
void read_fixed_point(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order, bool unsigned_p, const gdb_mpq &scaling_factor)
gdb_mpz get_rounded() const
void read(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order, bool unsigned_p)
void write(gdb::array_view< gdb_byte > buf, enum bfd_endian byte_order, bool unsigned_p) const
void safe_export(gdb::array_view< gdb_byte > buf, int endian, bool unsigned_p) const