This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA 1/2] Fix two regressions in scalar printing
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
Pedro> Yeah, that seems OK to me GDB-output-wise. "You get what you ask
Pedro> for".
Here is an updated version of this patch, that (I think) implements what
was discussed in this thread.
I regtested it on the buildbot.
Let me know what you think.
Tom
commit 32d9b636591021a7d2a31ce53da6ba1db9f85689
Author: Tom Tromey <tom@tromey.com>
Date: Tue Jul 11 06:40:40 2017 -0600
Fix two regressions in scalar printing
PR gdb/21675 points out a few regressions in scalar printing.
One type of regression is due to not carrying over the old handling of
floating point printing -- where a format like "/d" causes a floating
point number to first be cast to a signed integer. This patch restores
this behavior.
The other regression is a longstanding bug in print_octal_chars: one of
the constants was wrong. This patch fixes the constant and adds static
asserts to help catch this sort of error.
gdb/ChangeLog
2017-07-31 Tom Tromey <tom@tromey.com>
PR gdb/21675
* valprint.c (LOW_ZERO): Change value to 034.
(print_octal_chars): Add static_asserts for octal constants.
* printcmd.c (print_scalar_formatted): Add 'd' case.
gdb/testsuite/ChangeLog
2017-07-31 Tom Tromey <tom@tromey.com>
PR gdb/21675:
* gdb.base/printcmds.exp (test_radices): New function.
* gdb.dwarf2/var-access.exp: Use p/u, not p/d.
* gdb.base/sizeof.exp (check_valueof): Use p/d.
* lib/gdb.exp (get_integer_valueof): Use p/d.
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index dd66a45..afdfb16 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2017-07-31 Tom Tromey <tom@tromey.com>
+
+ PR gdb/21675
+ * valprint.c (LOW_ZERO): Change value to 034.
+ (print_octal_chars): Add static_asserts for octal constants.
+ * printcmd.c (print_scalar_formatted): Add 'd' case.
+
2017-07-31 Xavier Roirand <roirand@adacore.com>
* solib-darwin.c (DYLD_VERSION_MAX): Increase value.
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index a8cc052..f5ed513 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -413,7 +413,9 @@ print_scalar_formatted (const gdb_byte *valaddr, struct type *type,
&& (options->format == 'o'
|| options->format == 'x'
|| options->format == 't'
- || options->format == 'z'))
+ || options->format == 'z'
+ || options->format == 'd'
+ || options->format == 'u'))
{
LONGEST val_long = unpack_long (type, valaddr);
converted_float_bytes.resize (TYPE_LENGTH (type));
@@ -427,11 +429,13 @@ print_scalar_formatted (const gdb_byte *valaddr, struct type *type,
case 'o':
print_octal_chars (stream, valaddr, len, byte_order);
break;
+ case 'd':
+ print_decimal_chars (stream, valaddr, len, true, byte_order);
+ break;
case 'u':
print_decimal_chars (stream, valaddr, len, false, byte_order);
break;
case 0:
- case 'd':
if (TYPE_CODE (type) != TYPE_CODE_FLT)
{
print_decimal_chars (stream, valaddr, len, !TYPE_UNSIGNED (type),
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 2a777a8..f763661 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2017-07-31 Tom Tromey <tom@tromey.com>
+
+ PR gdb/21675:
+ * gdb.base/printcmds.exp (test_radices): New function.
+ * gdb.dwarf2/var-access.exp: Use p/u, not p/d.
+ * gdb.base/sizeof.exp (check_valueof): Use p/d.
+ * lib/gdb.exp (get_integer_valueof): Use p/d.
+
2017-07-26 Yao Qi <yao.qi@linaro.org>
* gdb.gdb/unittest.exp: Invoke command
diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp
index 323ca73..03275c3 100644
--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -155,6 +155,13 @@ proc test_float_rejected {} {
test_print_reject "p 1.1ll"
}
+# Regression test for PR gdb/21675
+proc test_radices {} {
+ gdb_test "print/o 16777211" " = 077777773"
+ gdb_test "print/d 1.5" " = 1\[^.\]"
+ gdb_test "print/u 1.5" " = 1\[^.\]"
+}
+
proc test_print_all_chars {} {
global gdb_prompt
@@ -981,3 +988,4 @@ test_printf
test_printf_with_dfp
test_print_symbol
test_repeat_bytes
+test_radices
diff --git a/gdb/testsuite/gdb.base/sizeof.exp b/gdb/testsuite/gdb.base/sizeof.exp
index d7ada65..5d89407 100644
--- a/gdb/testsuite/gdb.base/sizeof.exp
+++ b/gdb/testsuite/gdb.base/sizeof.exp
@@ -81,7 +81,7 @@ check_sizeof "long double" ${sizeof_long_double}
proc check_valueof { exp val } {
gdb_test "next" "" ""
- gdb_test "p value" " = ${val}" "check valueof \"$exp\""
+ gdb_test "p /d value" " = ${val}" "check valueof \"$exp\""
}
# Check that GDB and the target agree over the sign of a character.
diff --git a/gdb/testsuite/gdb.dwarf2/var-access.exp b/gdb/testsuite/gdb.dwarf2/var-access.exp
index 8ebad6a..9180c88 100644
--- a/gdb/testsuite/gdb.dwarf2/var-access.exp
+++ b/gdb/testsuite/gdb.dwarf2/var-access.exp
@@ -282,16 +282,16 @@ gdb_test_no_output "set var \$[lindex $regname 0] = 81" \
"init reg for s2.a"
gdb_test_no_output "set var \$[lindex $regname 1] = 28" \
"init reg for s2.c"
-gdb_test "print/d s2" " = \\{a = 81, b = 4, c = 28, d = 5\\}" \
+gdb_test "print/u s2" " = \\{a = 81, b = 4, c = 28, d = 5\\}" \
"initialized s2 from mem and regs"
gdb_test_no_output "set var s2.c += s2.a + s2.b - s2.d"
-gdb_test "print/d s2" " = \\{a = 81, b = 4, c = 108, d = 5\\}" \
+gdb_test "print/u s2" " = \\{a = 81, b = 4, c = 108, d = 5\\}" \
"verify s2.c"
-gdb_test "print/d \$[lindex $regname 1]" " = 108" \
+gdb_test "print/u \$[lindex $regname 1]" " = 108" \
"verify s2.c through reg"
gdb_test_no_output "set var s2 = {191, 73, 231, 123}" \
"re-initialize s2"
-gdb_test "print/d s2" " = \\{a = 191, b = 73, c = 231, d = 123\\}" \
+gdb_test "print/u s2" " = \\{a = 191, b = 73, c = 231, d = 123\\}" \
"verify re-initialized s2"
# Unaligned bitfield access through byte-aligned pieces.
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 1667882..9e216cf 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -1593,15 +1593,21 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
*/
#define BITS_IN_OCTAL 3
#define HIGH_ZERO 0340
-#define LOW_ZERO 0016
+#define LOW_ZERO 0034
#define CARRY_ZERO 0003
+ static_assert (HIGH_ZERO + LOW_ZERO + CARRY_ZERO == 0xff,
+ "cycle zero constants are wrong");
#define HIGH_ONE 0200
#define MID_ONE 0160
#define LOW_ONE 0016
#define CARRY_ONE 0001
+ static_assert (HIGH_ONE + MID_ONE + LOW_ONE + CARRY_ONE == 0xff,
+ "cycle one constants are wrong");
#define HIGH_TWO 0300
#define MID_TWO 0070
#define LOW_TWO 0007
+ static_assert (HIGH_TWO + MID_TWO + LOW_TWO == 0xff,
+ "cycle two constants are wrong");
/* For 32 we start in cycle 2, with two bits and one bit carry;
for 64 in cycle in cycle 1, with one bit and a two bit carry. */