[binutils-gdb] gdb: fix debug dump of OP_BOOL expressions

Andrew Burgess aburgess@sourceware.org
Tue Jan 12 09:45:27 GMT 2021


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

commit ce38f5edf1de7edefa983fd0d71a25ea8d2140b8
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Mon Jan 11 15:40:18 2021 +0000

    gdb: fix debug dump of OP_BOOL expressions
    
    Consider this GDB session:
    
      (gdb) set language fortran
      (gdb) set debug expression 1
      (gdb) p .TRUE.
      Dump of expression @ 0x4055d90, before conversion to prefix form:
            Language fortran, 3 elements, 16 bytes each.
            Index                Opcode         Hex Value  String Value
                0               OP_BOOL  79  O...............
                1             BINOP_ADD  1  ................
                2               OP_BOOL  79  O...............
      Dump of expression @ 0x4055d90, after conversion to prefix form:
      Expression: `TRUE'
            Language fortran, 3 elements, 16 bytes each.
    
                0  OP_BOOL               Unknown format
                1  BINOP_ADD
                2    OP_BOOL               Unknown format
                3    OP_NULL               Unknown format
      $1 = .TRUE.
    
    The final dump of the OP_BOOL is completely wrong.  After this patch
    we now get:
    
      (gdb) set language fortran
      (gdb) set debug expression 1
      (gdb) p .TRUE.
      Dump of expression @ 0x2d07470, before conversion to prefix form:
            Language fortran, 3 elements, 16 bytes each.
            Index                Opcode         Hex Value  String Value
                0               OP_BOOL  79  O...............
                1             BINOP_ADD  1  ................
                2               OP_BOOL  79  O...............
      Dump of expression @ 0x2d07470, after conversion to prefix form:
      Expression: `TRUE'
            Language fortran, 3 elements, 16 bytes each.
    
                0  OP_BOOL               TRUE
      $1 = .TRUE.
    
    Much better.  I added a test for this into the Fortran testsuite.
    
    gdb/ChangeLog:
    
            * expprint.c (dump_subexp_body_standard): Handle OP_BOOL.
    
    gdb/testsuite/ChangeLog:
    
            * gdb.fortran/debug-expr.exp: Add new tests.

Diff:
---
 gdb/ChangeLog                            | 4 ++++
 gdb/expprint.c                           | 9 ++++++++-
 gdb/testsuite/ChangeLog                  | 4 ++++
 gdb/testsuite/gdb.fortran/debug-expr.exp | 8 ++++++++
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 720d3b230b2..d4a1b98aaca 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2021-01-12  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* expprint.c (dump_subexp_body_standard): Handle OP_BOOL.
+
 2021-01-12  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* f-exp.y (dot_ops): Rename to...
diff --git a/gdb/expprint.c b/gdb/expprint.c
index f75874b77df..d95835fc47d 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -1121,11 +1121,18 @@ dump_subexp_body_standard (struct expression *exp,
       }
       break;
 
+    case OP_BOOL:
+      {
+	bool val = (bool) (exp->elts[elt].longconst);
+	fputs_filtered (val ? "TRUE" : "FALSE", stream);
+	elt += 2;
+      }
+      break;
+
     default:
     case OP_NULL:
     case MULTI_SUBSCRIPT:
     case OP_COMPLEX:
-    case OP_BOOL:
     case OP_M2_STRING:
     case OP_THIS:
     case OP_NAME:
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index e31b712f01c..0cae3181d80 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2021-01-12  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.fortran/debug-expr.exp: Add new tests.
+
 2021-01-12  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* gdb.fortran/dot-ops.exp: Add new tests.
diff --git a/gdb/testsuite/gdb.fortran/debug-expr.exp b/gdb/testsuite/gdb.fortran/debug-expr.exp
index 4111d8daa36..fd63ea7b81a 100644
--- a/gdb/testsuite/gdb.fortran/debug-expr.exp
+++ b/gdb/testsuite/gdb.fortran/debug-expr.exp
@@ -41,3 +41,11 @@ gdb_continue_to_breakpoint "Break Here"
 
 gdb_test_no_output "set debug expression 1"
 gdb_test_debug_expr "print obj%three(1)%two(1)%one(1)%i" "\\\$$decimal = 1"
+gdb_test_debug_expr "print .TRUE."  [multi_line \
+					 "" \
+					 "\\s+0\\s+OP_BOOL\\s+TRUE" \
+					 "\\\$$decimal = \.TRUE\."]
+gdb_test_debug_expr "print .FALSE."  [multi_line \
+					  "" \
+					  "\\s+0\\s+OP_BOOL\\s+FALSE" \
+					  "\\\$$decimal = \.FALSE\."]


More information about the Gdb-cvs mailing list