From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [RFA 2/5] Let print_decimal_chars handle signed values
Date: Fri, 02 Jun 2017 19:37:00 -0000 [thread overview]
Message-ID: <20170602193651.3173-3-tom@tromey.com> (raw)
In-Reply-To: <20170602193651.3173-1-tom@tromey.com>
This changes print_decimal_chars to handle signed values.
gdb/ChangeLog
2017-06-02 Tom Tromey <tom@tromey.com>
PR exp/16225:
* valprint.h (print_decimal_chars): Update.
* valprint.c (maybe_negate_by_bytes): New function.
(print_decimal_chars): Add "is_signed" argument.
* printcmd.c (print_scalar_formatted): Update.
---
gdb/ChangeLog | 8 ++++++++
gdb/printcmd.c | 3 ++-
gdb/valprint.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
gdb/valprint.h | 2 +-
4 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index bc2ac04..a529694 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,6 +1,14 @@
2017-06-02 Tom Tromey <tom@tromey.com>
PR exp/16225:
+ * valprint.h (print_decimal_chars): Update.
+ * valprint.c (maybe_negate_by_bytes): New function.
+ (print_decimal_chars): Add "is_signed" argument.
+ * printcmd.c (print_scalar_formatted): Update.
+
+2017-06-02 Tom Tromey <tom@tromey.com>
+
+ PR exp/16225:
* valprint.h (print_binary_chars, print_hex_chars): Update.
* valprint.c (val_print_type_code_int): Update.
(print_binary_chars): Add "zero_pad" argument.
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index 66395d5..84f41f5 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -374,7 +374,8 @@ print_scalar_formatted (const gdb_byte *valaddr, struct type *type,
return;
case 'u':
case 'd':
- print_decimal_chars (stream, valaddr, len, byte_order);
+ print_decimal_chars (stream, valaddr, len, !TYPE_UNSIGNED (type),
+ byte_order);
return;
case 't':
print_binary_chars (stream, valaddr, len, byte_order, size > 0);
diff --git a/gdb/valprint.c b/gdb/valprint.c
index aa34b68..fcd74f1 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -1763,12 +1763,58 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
}
+/* Possibly negate the integer represented by BYTES. It contains LEN
+ bytes in the specified byte order. If the integer is negative,
+ copy it into OUT_VEC, negate it, and return true. Otherwise, do
+ nothing and return false. */
+
+static bool
+maybe_negate_by_bytes (const gdb_byte *bytes, unsigned len,
+ enum bfd_endian byte_order,
+ std::vector<gdb_byte> *out_vec)
+{
+ gdb_byte sign_byte;
+ if (byte_order == BFD_ENDIAN_BIG)
+ sign_byte = bytes[0];
+ else
+ sign_byte = bytes[len - 1];
+ if ((sign_byte & 0x80) == 0)
+ return false;
+
+ out_vec->reserve (len);
+
+ /* Compute -x == 1 + ~x. */
+ if (byte_order == BFD_ENDIAN_LITTLE)
+ {
+ unsigned carry = 1;
+ for (unsigned i = 0; i < len; ++i)
+ {
+ unsigned tem = (0xff & ~bytes[i]) + carry;
+ (*out_vec)[i] = tem & 0xff;
+ carry = tem / 256;
+ }
+ }
+ else
+ {
+ unsigned carry = 1;
+ for (unsigned i = len; i > 0; --i)
+ {
+ unsigned tem = (0xff & ~bytes[i - 1]) + carry;
+ (*out_vec)[i - 1] = tem & 0xff;
+ carry = tem / 256;
+ }
+ }
+
+ return true;
+}
+
/* VALADDR points to an integer of LEN bytes.
Print it in decimal on stream or format it in buf. */
void
print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
- unsigned len, enum bfd_endian byte_order)
+ unsigned len, bool is_signed,
+ enum bfd_endian byte_order)
{
#define TEN 10
#define CARRY_OUT( x ) ((x) / TEN) /* extend char to int */
@@ -1784,6 +1830,14 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
int dummy;
int flip;
+ std::vector<gdb_byte> negated_bytes;
+ if (is_signed
+ && maybe_negate_by_bytes (valaddr, len, byte_order, &negated_bytes))
+ {
+ fputs_filtered ("-", stream);
+ valaddr = negated_bytes.data ();
+ }
+
/* Base-ten number is less than twice as many digits
as the base 16 number, which is 2 digits per byte. */
diff --git a/gdb/valprint.h b/gdb/valprint.h
index 8bfad21..f71d4ab 100644
--- a/gdb/valprint.h
+++ b/gdb/valprint.h
@@ -138,7 +138,7 @@ extern void print_octal_chars (struct ui_file *, const gdb_byte *,
unsigned int, enum bfd_endian);
extern void print_decimal_chars (struct ui_file *, const gdb_byte *,
- unsigned int, enum bfd_endian);
+ unsigned int, bool, enum bfd_endian);
extern void print_hex_chars (struct ui_file *, const gdb_byte *,
unsigned int, enum bfd_endian, bool);
--
2.9.3
next prev parent reply other threads:[~2017-06-02 19:37 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-02 19:36 [RFA 0/5] improve printing of 128 bit ints Tom Tromey
2017-06-02 19:37 ` [RFA 4/5] Remove val_print_type_code_int Tom Tromey
2017-06-02 19:37 ` [RFA 3/5] Simplify print_scalar_formatted Tom Tromey
2017-06-05 17:27 ` Pedro Alves
2017-06-02 19:37 ` [RFA 1/5] Don't always zero pad in print_*_chars Tom Tromey
2017-06-05 17:27 ` Pedro Alves
2017-06-02 19:37 ` [RFA 5/5] Add some 128-bit integer tests Tom Tromey
2017-06-05 17:33 ` Pedro Alves
2017-06-02 19:37 ` Tom Tromey [this message]
2017-06-05 17:22 ` [RFA 2/5] Let print_decimal_chars handle signed values Pedro Alves
2017-06-05 19:38 ` Tom Tromey
2017-06-05 17:35 ` [RFA 0/5] improve printing of 128 bit ints Pedro Alves
2017-06-08 14:32 ` Tom Tromey
2017-06-08 16:12 ` Power/AltiVec question (Re: [RFA 0/5] improve printing of 128 bit ints) Pedro Alves
2017-06-12 14:34 ` Tom Tromey
2017-06-12 18:26 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170602193651.3173-3-tom@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).