aboutsummaryrefslogtreecommitdiff
path: root/gdb/expprint.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-11-06 13:40:22 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-11-06 20:58:06 +0000
commit86775fab42c7d6646722ee0404c4987b769a9dfe (patch)
treee72b1d594451834908de34b212001eca4f499f42 /gdb/expprint.c
parenta1945bd4520d2964e7d022b9171bf6bb58d8e90a (diff)
downloadgdb-86775fab42c7d6646722ee0404c4987b769a9dfe.zip
gdb-86775fab42c7d6646722ee0404c4987b769a9dfe.tar.gz
gdb-86775fab42c7d6646722ee0404c4987b769a9dfe.tar.bz2
gdb: fix debug expression dumping of function call expressions
In commit: commit 6d81691950f8c4be4a49a85a672255c140e82468 CommitDate: Sat Sep 19 09:44:58 2020 +0100 gdb/fortran: Move Fortran expression handling into f-lang.c A bug was introduced that broke GDB's ability to perform debug dumps of expressions containing function calls. For example this would no longer work: (gdb) set debug expression 1 (gdb) print call_me (&val) Dump of expression @ 0x4eced60, before conversion to prefix form: Language c, 12 elements, 16 bytes each. Index Opcode Hex Value String Value 0 OP_VAR_VALUE 40 (............... 1 OP_M2_STRING 79862864 P............... 2 unknown opcode: 224 79862240 ................ 3 OP_VAR_VALUE 40 (............... 4 OP_VAR_VALUE 40 (............... 5 OP_RUST_ARRAY 79861600 `............... 6 UNOP_PREDECREMENT 79861312 @............... 7 OP_VAR_VALUE 40 (............... 8 UNOP_ADDR 61 =............... 9 OP_FUNCALL 46 ................ 10 BINOP_ADD 1 ................ 11 OP_FUNCALL 46 ................ Dump of expression @ 0x4eced60, after conversion to prefix form: Expression: `call_me (&main::val, VAL(Aborted (core dumped) The situation was even worse for Fortran function calls, or array indexes, which both make use of the same expression opcode. The problem was that in a couple of places the index into the expression array was handled incorrectly causing GDB to interpret elements incorrectly. These issues are fixed in this commit. There are already some tests to check GDB when 'set debug expression 1' is set, these can be found in gdb.*/debug-expr.exp. Unfortunately the cases above were not covered. In this commit I have cleaned up all of the debug-expr.exp files a little, there was a helper function that had clearly been copied into each file, this is now moved into lib/gdb.exp. I've added a gdb.fortran/debug-expr.exp test file, and extended gdb.base/debug-expr.exp to cover the function call case. gdb/ChangeLog: * expprint.c (print_subexp_funcall): Increment expression position after reading argument count. * f-lang.c (print_subexp_f): Skip over opcode before calling common function. (dump_subexp_body_f): Likewise. gdb/testsuite/ChangeLog: * gdb.base/debug-expr.c: Add extra function to allow for an additional test. * gdb.base/debug-expr.exp (test_debug_expr): Delete, replace calls to this proc with gdb_test_debug_expr. Add an extra test. * gdb.cp/debug-expr.exp (test_debug_expr): Delete, replace calls to this proc with gdb_test_debug_expr, give the tests names * gdb.dlang/debug-expr.exp (test_debug_expr): Delete, replace calls to this proc with gdb_test_debug_expr, give the tests names * gdb.fortran/debug-expr.exp: New file. * gdb.fortran/debug-expr.f90: New file. * lib/gdb.exp (gdb_test_debug_expr): New proc.
Diffstat (limited to 'gdb/expprint.c')
-rw-r--r--gdb/expprint.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/expprint.c b/gdb/expprint.c
index f4668aa..29e6237 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -60,8 +60,8 @@ void
print_subexp_funcall (struct expression *exp, int *pos,
struct ui_file *stream)
{
- (*pos) += 2;
unsigned nargs = longest_to_int (exp->elts[*pos].longconst);
+ (*pos) += 2;
print_subexp (exp, pos, stream, PREC_SUFFIX);
fputs_filtered (" (", stream);
for (unsigned tem = 0; tem < nargs; tem++)