21#include "gdbsupport/selftest.h"
43 l_expected = (LONGEST) 1 << (
sizeof (LONGEST) * 8 - 1);
45 mpz_ui_pow_ui (v.
val, 2, sizeof (LONGEST) * 8 - 1);
48 SELF_CHECK (v.
as_integer<LONGEST> () == l_expected);
52 for (
int i = -256; i <= 256; i++)
54 l_expected = (LONGEST) i;
55 mpz_set_si (v.
val, i);
56 SELF_CHECK (v.
as_integer<LONGEST> () == l_expected);
60 ul_expected = (ULONGEST) i;
61 mpz_set_ui (v.
val, i);
62 SELF_CHECK (v.
as_integer<ULONGEST> () == ul_expected);
68 ul_expected = (ULONGEST) l_expected;
70 mpz_ui_pow_ui (v.
val, 2, sizeof (LONGEST) * 8 - 1);
71 mpz_sub_ui (v.
val, v.
val, 1);
73 SELF_CHECK (v.
as_integer<LONGEST> () == l_expected);
74 SELF_CHECK (v.
as_integer<ULONGEST> () == ul_expected);
78 mpz_ui_pow_ui (v.
val, 2, sizeof (LONGEST) * 8);
79 mpz_sub_ui (v.
val, v.
val, 1);
81 SELF_CHECK (v.
as_integer<ULONGEST> () == ul_expected);
88template<
typename T,
typename = gdb::Requires<std::is_
integral<T>>>
96 catch (
const gdb_exception_error &ex)
98 SELF_CHECK (ex.reason == RETURN_ERROR);
99 SELF_CHECK (ex.error == GENERIC_ERROR);
100 SELF_CHECK (strstr (ex.what (),
"Cannot export value") !=
nullptr);
118 mpz_ui_pow_ui (v.
val, 2, sizeof (LONGEST) * 8 - 1);
120 mpz_sub_ui (v.
val, v.
val, 1);
122 check_as_integer_raises_out_of_range_error<ULONGEST> (v);
123 check_as_integer_raises_out_of_range_error<LONGEST> (v);
128 check_as_integer_raises_out_of_range_error<ULONGEST> (v);
129 SELF_CHECK (v.
as_integer<LONGEST> () == (LONGEST) -1);
133 mpz_add_ui (v.
val, v.
val, 1);
136 check_as_integer_raises_out_of_range_error<LONGEST> (v);
140 mpz_add_ui (v.
val, v.
val, 1);
142 check_as_integer_raises_out_of_range_error<ULONGEST> (v);
143 check_as_integer_raises_out_of_range_error<LONGEST> (v);
168 buf = (gdb_byte *) alloca (buf_len);
172 mpz_set (actual.
val, expected.
val);
173 mpz_sub_ui (actual.
val, actual.
val, 500);
175 actual.
read ({buf, buf_len}, byte_order, !std::is_signed<T>::value);
191 LONGEST l_min = -pow (2.0, buf_len * 8 - 1);
192 LONGEST l_max = pow (2.0, buf_len * 8 - 1) - 1;
194 for (LONGEST l = l_min; l <= l_max; l++)
199 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
202 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
207 ULONGEST ul_max = pow (2.0, buf_len * 8) - 1;
209 for (ULONGEST ul = ul_min; ul <= ul_max; ul++)
214 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
217 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
230 LONGEST l_min = (LONGEST) 1 << (
sizeof (LONGEST) * 8 - 1);
234 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
238 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
246 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
250 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
258 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
262 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
270 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
274 SELF_CHECK (mpz_cmp (actual.
val, expected.
val) == 0);
299 gdb_byte *buf = (gdb_byte *) alloca (buf_len);
300 v.
write ({buf, buf_len}, byte_order, !std::is_signed<T>::value);
302 return extract_integer<T> ({buf, buf_len}, byte_order);
314 LONGEST l_min = -pow (2.0, buf_len * 8 - 1);
315 LONGEST l_max = pow (2.0, buf_len * 8 - 1) - 1;
317 for (LONGEST l = l_min; l <= l_max; l++)
325 ULONGEST ul_max = pow (2.0, buf_len * 8) - 1;
327 for (ULONGEST ul = ul_min; ul <= ul_max; ul++)
341 LONGEST l_min = (LONGEST) 1 << (
sizeof (LONGEST) * 8 - 1);
357 ULONGEST ul_min = (ULONGEST) 1 << (
sizeof (ULONGEST) * 8 - 1);
390 enum bfd_endian byte_order,
395 const size_t len =
sizeof (unscaled);
401 mpq_set_si (expected.
val, unscaled, 1);
402 mpq_mul (expected.
val, expected.
val, scaling_factor.
val);
415 mpq_set_ui (scaling_factor.
val, 3, 5);
419 read_fp_test (-256, scaling_factor, BFD_ENDIAN_BIG, expected, actual);
420 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
421 read_fp_test (-256, scaling_factor, BFD_ENDIAN_LITTLE, expected, actual);
422 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
424 read_fp_test (-1, scaling_factor, BFD_ENDIAN_BIG, expected, actual);
425 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
426 read_fp_test (-1, scaling_factor, BFD_ENDIAN_LITTLE, expected, actual);
427 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
429 read_fp_test (0, scaling_factor, BFD_ENDIAN_BIG, expected, actual);
430 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
431 read_fp_test (0, scaling_factor, BFD_ENDIAN_LITTLE, expected, actual);
432 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
434 read_fp_test (1, scaling_factor, BFD_ENDIAN_BIG, expected, actual);
435 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
436 read_fp_test (1, scaling_factor, BFD_ENDIAN_LITTLE, expected, actual);
437 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
439 read_fp_test (1025, scaling_factor, BFD_ENDIAN_BIG, expected, actual);
440 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
441 read_fp_test (1025, scaling_factor, BFD_ENDIAN_LITTLE, expected, actual);
442 SELF_CHECK (mpq_cmp (actual.
val, expected.
val) == 0);
455 enum bfd_endian byte_order)
461 const size_t len =
sizeof (LONGEST);
463 memset (buf, 0, len);
466 mpq_set_si (v.
val, numerator, denominator);
467 mpq_canonicalize (v.
val);
482 mpq_set_ui (scaling_factor.
val, 1, 3);
489 SELF_CHECK (
write_fp_test (-8, 1, scaling_factor, BFD_ENDIAN_BIG) == -24);
490 SELF_CHECK (
write_fp_test (-8, 1, scaling_factor, BFD_ENDIAN_LITTLE) == -24);
492 SELF_CHECK (
write_fp_test (-2, 3, scaling_factor, BFD_ENDIAN_BIG) == -2);
493 SELF_CHECK (
write_fp_test (-2, 3, scaling_factor, BFD_ENDIAN_LITTLE) == -2);
495 SELF_CHECK (
write_fp_test (0, 3, scaling_factor, BFD_ENDIAN_BIG) == 0);
496 SELF_CHECK (
write_fp_test (0, 3, scaling_factor, BFD_ENDIAN_LITTLE) == 0);
498 SELF_CHECK (
write_fp_test (5, 3, scaling_factor, BFD_ENDIAN_BIG) == 5);
499 SELF_CHECK (
write_fp_test (5, 3, scaling_factor, BFD_ENDIAN_LITTLE) == 5);
509 selftests::register_test (
"gdb_mpz_as_integer",
511 selftests::register_test (
"gdb_mpz_as_integer_out_of_range",
513 selftests::register_test (
"gdb_mpz_read_all_from_small",
515 selftests::register_test (
"gdb_mpz_read_min_max",
517 selftests::register_test (
"gdb_mpz_write_all_from_small",
519 selftests::register_test (
"gdb_mpz_write_min_max",
521 selftests::register_test (
"gdb_mpq_read_fixed_point",
523 selftests::register_test (
"gdb_mpq_write_fixed_point",
void store_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, T val)
static void store_signed_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, LONGEST val)
static ULONGEST extract_unsigned_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
void _initialize_gmp_utils_selftests()
static void gdb_mpz_read_all_from_small()
void store_and_read_back(T val, size_t buf_len, enum bfd_endian byte_order, gdb_mpz &expected, gdb_mpz &actual)
static LONGEST write_fp_test(int numerator, unsigned int denominator, const gdb_mpq &scaling_factor, enum bfd_endian byte_order)
static void gdb_mpz_write_all_from_small()
static void gdb_mpz_as_integer()
static void read_fp_test(int unscaled, const gdb_mpq &scaling_factor, enum bfd_endian byte_order, gdb_mpq &expected, gdb_mpq &actual)
static void gdb_mpq_write_fixed_point()
static void gdb_mpz_write_min_max()
static void check_as_integer_raises_out_of_range_error(const gdb_mpz &val)
static void gdb_mpz_read_min_max()
static void gdb_mpq_read_fixed_point()
T write_and_extract(T val, size_t buf_len, enum bfd_endian byte_order)
static void gdb_mpz_as_integer_out_of_range()
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)
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