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.
+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...
}
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:
+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.
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\."]