Don't always zero pad in print_*_chars

This changes print_octal_chars and print_decimal_chars to never zero
pad, and changes print_binary_chars and print_hex_chars to only
optionally zero-pad, based on a flag.

ChangeLog
2017-06-12  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.
	(emit_octal_digit): New function.
	(print_octal_chars): Don't zero-pad.
	(print_decimal_chars): Likewise.
	(print_hex_chars): Add "zero_pad" argument.
	* sh64-tdep.c (sh64_do_fp_register): Update.
	* regcache.c (regcache::dump): Update.
	* printcmd.c (print_scalar_formatted): Update.
	* infcmd.c (default_print_one_register_info): Update.

2017-06-12  Tom Tromey  <tom@tromey.com>

	PR exp/16225:
	* gdb.reverse/i386-sse-reverse.exp: Update tests.
	* gdb.arch/vsx-regs.exp: Update tests.
	* gdb.arch/s390-vregs.exp (hex128): New proc.
	Update test.
	* gdb.arch/altivec-regs.exp: Update tests.
This commit is contained in:
Tom Tromey 2017-05-22 03:55:58 -06:00
parent b3464d0316
commit 30a254669b
12 changed files with 197 additions and 118 deletions

View file

@ -1264,7 +1264,7 @@ val_print_type_code_int (struct type *type, const gdb_byte *valaddr,
complement (a reasonable assumption, I think) and do
better than this. */
print_hex_chars (stream, (unsigned char *) valaddr,
TYPE_LENGTH (type), byte_order);
TYPE_LENGTH (type), byte_order, false);
}
}
else
@ -1537,7 +1537,7 @@ print_decimal_floating (const gdb_byte *valaddr, struct type *type,
void
print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
unsigned len, enum bfd_endian byte_order)
unsigned len, enum bfd_endian byte_order, bool zero_pad)
{
#define BITS_IN_BYTES 8
@ -1545,14 +1545,13 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
const gdb_byte *p;
unsigned int i;
int b;
bool seen_a_one = false;
/* Declared "int" so it will be signed.
This ensures that right shift will shift in zeros. */
const int mask = 0x080;
/* FIXME: We should be not printing leading zeroes in most cases. */
if (byte_order == BFD_ENDIAN_BIG)
{
for (p = valaddr;
@ -1565,11 +1564,14 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
for (i = 0; i < (BITS_IN_BYTES * sizeof (*p)); i++)
{
if (*p & (mask >> i))
b = 1;
b = '1';
else
b = 0;
b = '0';
fprintf_filtered (stream, "%1d", b);
if (zero_pad || seen_a_one || b == '1')
fputc_filtered (b, stream);
if (b == '1')
seen_a_one = true;
}
}
}
@ -1582,14 +1584,34 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
for (i = 0; i < (BITS_IN_BYTES * sizeof (*p)); i++)
{
if (*p & (mask >> i))
b = 1;
b = '1';
else
b = 0;
b = '0';
fprintf_filtered (stream, "%1d", b);
if (zero_pad || seen_a_one || b == '1')
fputc_filtered (b, stream);
if (b == '1')
seen_a_one = true;
}
}
}
/* When not zero-padding, ensure that something is printed when the
input is 0. */
if (!zero_pad && !seen_a_one)
fputc_filtered ('0', stream);
}
/* A helper for print_octal_chars that emits a single octal digit,
optionally suppressing it if is zero and updating SEEN_A_ONE. */
static void
emit_octal_digit (struct ui_file *stream, bool *seen_a_one, int digit)
{
if (*seen_a_one || digit != 0)
fprintf_filtered (stream, "%o", digit);
if (digit != 0)
*seen_a_one = true;
}
/* VALADDR points to an integer of LEN bytes.
@ -1603,9 +1625,6 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
unsigned char octa1, octa2, octa3, carry;
int cycle;
/* FIXME: We should be not printing leading zeroes in most cases. */
/* Octal is 3 bits, which doesn't fit. Yuk. So we have to track
* the extra bits, which cycle every three bytes:
*
@ -1640,6 +1659,7 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
carry = 0;
fputs_filtered ("0", stream);
bool seen_a_one = false;
if (byte_order == BFD_ENDIAN_BIG)
{
for (p = valaddr;
@ -1654,8 +1674,8 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa1 = (HIGH_ZERO & *p) >> 5;
octa2 = (LOW_ZERO & *p) >> 2;
carry = (CARRY_ZERO & *p);
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
break;
case 1:
@ -1665,9 +1685,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa2 = (MID_ONE & *p) >> 4;
octa3 = (LOW_ONE & *p) >> 1;
carry = (CARRY_ONE & *p);
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
fprintf_filtered (stream, "%o", octa3);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
emit_octal_digit (stream, &seen_a_one, octa3);
break;
case 2:
@ -1677,9 +1697,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa2 = (MID_TWO & *p) >> 3;
octa3 = (LOW_TWO & *p);
carry = 0;
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
fprintf_filtered (stream, "%o", octa3);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
emit_octal_digit (stream, &seen_a_one, octa3);
break;
default:
@ -1704,8 +1724,8 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa1 = (HIGH_ZERO & *p) >> 5;
octa2 = (LOW_ZERO & *p) >> 2;
carry = (CARRY_ZERO & *p);
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
break;
case 1:
@ -1715,9 +1735,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa2 = (MID_ONE & *p) >> 4;
octa3 = (LOW_ONE & *p) >> 1;
carry = (CARRY_ONE & *p);
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
fprintf_filtered (stream, "%o", octa3);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
emit_octal_digit (stream, &seen_a_one, octa3);
break;
case 2:
@ -1727,9 +1747,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
octa2 = (MID_TWO & *p) >> 3;
octa3 = (LOW_TWO & *p);
carry = 0;
fprintf_filtered (stream, "%o", octa1);
fprintf_filtered (stream, "%o", octa2);
fprintf_filtered (stream, "%o", octa3);
emit_octal_digit (stream, &seen_a_one, octa1);
emit_octal_digit (stream, &seen_a_one, octa2);
emit_octal_digit (stream, &seen_a_one, octa3);
break;
default:
@ -1758,7 +1778,6 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
#define HIGH_NIBBLE( x ) (((x) & 0x0F0) >> 4)
const gdb_byte *p;
unsigned char *digits;
int carry;
int decimal_len;
int i, j, decimal_digits;
@ -1769,12 +1788,7 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
as the base 16 number, which is 2 digits per byte. */
decimal_len = len * 2 * 2;
digits = (unsigned char *) xmalloc (decimal_len);
for (i = 0; i < decimal_len; i++)
{
digits[i] = 0;
}
std::vector<unsigned char> digits (decimal_len, 0);
/* Ok, we have an unknown number of bytes of data to be printed in
* decimal.
@ -1868,40 +1882,73 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
/* Ok, now "digits" is the decimal representation, with
the "decimal_digits" actual digits. Print! */
for (i = decimal_digits - 1; i >= 0; i--)
for (i = decimal_digits - 1; i > 0 && digits[i] == 0; --i)
;
for (; i >= 0; i--)
{
fprintf_filtered (stream, "%1d", digits[i]);
}
xfree (digits);
}
/* VALADDR points to an integer of LEN bytes. Print it in hex on stream. */
void
print_hex_chars (struct ui_file *stream, const gdb_byte *valaddr,
unsigned len, enum bfd_endian byte_order)
unsigned len, enum bfd_endian byte_order,
bool zero_pad)
{
const gdb_byte *p;
/* FIXME: We should be not printing leading zeroes in most cases. */
fputs_filtered ("0x", stream);
if (byte_order == BFD_ENDIAN_BIG)
{
for (p = valaddr;
p = valaddr;
if (!zero_pad)
{
/* Strip leading 0 bytes, but be sure to leave at least a
single byte at the end. */
for (; p < valaddr + len - 1 && !*p; ++p)
;
}
const gdb_byte *first = p;
for (;
p < valaddr + len;
p++)
{
fprintf_filtered (stream, "%02x", *p);
/* When not zero-padding, use a different format for the
very first byte printed. */
if (!zero_pad && p == first)
fprintf_filtered (stream, "%x", *p);
else
fprintf_filtered (stream, "%02x", *p);
}
}
else
{
for (p = valaddr + len - 1;
p = valaddr + len - 1;
if (!zero_pad)
{
/* Strip leading 0 bytes, but be sure to leave at least a
single byte at the end. */
for (; p >= valaddr + 1 && !*p; --p)
;
}
const gdb_byte *first = p;
for (;
p >= valaddr;
p--)
{
fprintf_filtered (stream, "%02x", *p);
/* When not zero-padding, use a different format for the
very first byte printed. */
if (!zero_pad && p == first)
fprintf_filtered (stream, "%x", *p);
else
fprintf_filtered (stream, "%02x", *p);
}
}
}