aboutsummaryrefslogtreecommitdiff
path: root/gdb/gmp-utils.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-03-01 12:33:27 -0700
committerTom Tromey <tromey@adacore.com>2023-03-27 08:20:29 -0600
commitc7c3708ac778625d3a87aad541de5f0666acbcc5 (patch)
tree4130dbcad187159564716bfa2b2ac534aaec651c /gdb/gmp-utils.c
parentc225d6b80413d373c84f743b2c4e9b4851ff82dc (diff)
downloadgdb-c7c3708ac778625d3a87aad541de5f0666acbcc5.zip
gdb-c7c3708ac778625d3a87aad541de5f0666acbcc5.tar.gz
gdb-c7c3708ac778625d3a87aad541de5f0666acbcc5.tar.bz2
Avoid a copy in gdb_mpz::safe_export
Currently, gdb_mpz::safe_export will always make a copy of *this. However, this copy isn't always needed. This patch makes this code slightly more efficient, by avoiding the copy when possible.
Diffstat (limited to 'gdb/gmp-utils.c')
-rw-r--r--gdb/gmp-utils.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/gdb/gmp-utils.c b/gdb/gmp-utils.c
index d134bc3..57f5f97 100644
--- a/gdb/gmp-utils.c
+++ b/gdb/gmp-utils.c
@@ -81,7 +81,8 @@ gdb_mpz::safe_export (gdb::array_view<gdb_byte> buf,
{
gdb_assert (buf.size () > 0);
- if (mpz_sgn (m_val) == 0)
+ int sign = mpz_sgn (m_val);
+ if (sign == 0)
{
/* Our value is zero, so no need to call mpz_export to do the work,
especially since mpz_export's documentation explicitly says
@@ -121,17 +122,16 @@ gdb_mpz::safe_export (gdb::array_view<gdb_byte> buf,
lo.str ().c_str (),
hi.str ().c_str ());
- gdb_mpz exported_val (m_val);
-
- if (mpz_cmp_ui (exported_val.m_val, 0) < 0)
+ const gdb_mpz *exported_val = this;
+ gdb_mpz un_signed;
+ if (sign < 0)
{
/* mpz_export does not handle signed values, so create a positive
value whose bit representation as an unsigned of the same length
would be the same as our negative value. */
- gdb_mpz neg_offset;
-
- mpz_ui_pow_ui (neg_offset.m_val, 2, buf.size () * HOST_CHAR_BIT);
- mpz_add (exported_val.m_val, exported_val.m_val, neg_offset.m_val);
+ gdb_mpz neg_offset = gdb_mpz::pow (2, buf.size () * HOST_CHAR_BIT);
+ un_signed = *exported_val + neg_offset;
+ exported_val = &un_signed;
}
/* Do the export into a buffer allocated by GMP itself; that way,
@@ -147,7 +147,7 @@ gdb_mpz::safe_export (gdb::array_view<gdb_byte> buf,
size_t word_countp;
gdb::unique_xmalloc_ptr<void> exported
(mpz_export (NULL, &word_countp, -1 /* order */, buf.size () /* size */,
- endian, 0 /* nails */, exported_val.m_val));
+ endian, 0 /* nails */, exported_val->m_val));
gdb_assert (word_countp == 1);