gdb: fix debug dump of OP_BOOL expressions
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 11 Jan 2021 15:40:18 +0000 (15:40 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 12 Jan 2021 09:44:08 +0000 (09:44 +0000)
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.

gdb/ChangeLog
gdb/expprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/debug-expr.exp

index 720d3b230b2088a7f78843a9fee5afc0d1655a03..d4a1b98aacaf690b9b722bfe3054eaa5905bdb01 100644 (file)
@@ -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...
index f75874b77df2d38b8ba5ca5c6f0f4cf4ad85f8ed..d95835fc47d1a51bdfc2ff182e894744c0fec062 100644 (file)
@@ -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:
index e31b712f01c5d24811d8f2f8cd82dab520a4fc9a..0cae3181d809bb6e3db1f999c3cffe1d499b06cf 100644 (file)
@@ -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.
index 4111d8daa36fda04b41d4d6ab31c1567b718d12d..fd63ea7b81a6c6980ca8a003725f0a9b160f76c8 100644 (file)
@@ -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\."]