This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix two regressions in scalar printing


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d6382fffde99214ce4aee99a208ddb703c647008

commit d6382fffde99214ce4aee99a208ddb703c647008
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.
    
    ChangeLog
    2017-08-14  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.
    
    testsuite/ChangeLog
    2017-08-14  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:
---
 gdb/ChangeLog                           |  7 +++++++
 gdb/printcmd.c                          |  8 ++++++--
 gdb/testsuite/ChangeLog                 |  8 ++++++++
 gdb/testsuite/gdb.base/printcmds.exp    | 11 +++++++++++
 gdb/testsuite/gdb.base/sizeof.exp       |  2 +-
 gdb/testsuite/gdb.dwarf2/var-access.exp |  8 ++++----
 gdb/valprint.c                          |  8 +++++++-
 7 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index dcb591d..fd0f959 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-14  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-08-11  Tom Tromey  <tom@tromey.com>
 
 	* symfile.c (add_symbol_file_command): Use std::vector.
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index d5c83f0..a1231d4 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 23658b0..6db249b 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2017-08-14  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-08-12  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* lib/gdb.exp (get_valueof): Don't capture end-of-line
diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp
index 323ca73..9409c6a 100644
--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -155,6 +155,16 @@ 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"
+
+    gdb_test "print/u (char) -1" " = 255"
+    gdb_test "print/d (unsigned char) -1" " = -1"
+}
+
 proc test_print_all_chars {} {
     global gdb_prompt
 
@@ -981,3 +991,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.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]