gdb: fix debug expression dumping of function call expressions
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 6 Nov 2020 13:40:22 +0000 (13:40 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 6 Nov 2020 20:58:06 +0000 (20:58 +0000)
commit86775fab42c7d6646722ee0404c4987b769a9dfe
treee72b1d594451834908de34b212001eca4f499f42
parenta1945bd4520d2964e7d022b9171bf6bb58d8e90a
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.
gdb/ChangeLog
gdb/expprint.c
gdb/f-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/debug-expr.c
gdb/testsuite/gdb.base/debug-expr.exp
gdb/testsuite/gdb.cp/debug-expr.exp
gdb/testsuite/gdb.dlang/debug-expr.exp
gdb/testsuite/gdb.fortran/debug-expr.exp [new file with mode: 0644]
gdb/testsuite/gdb.fortran/debug-expr.f90 [new file with mode: 0644]
gdb/testsuite/lib/gdb.exp