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.
This commit is contained in:
Andrew Burgess 2021-01-11 15:40:18 +00:00
parent 7c654b719d
commit ce38f5edf1
4 changed files with 24 additions and 1 deletions

View 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...

View 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:

View 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.

View 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\."]