gdb: Forward VALUE_LVAL when avoiding side effects for STRUCTOP_PTR
authorAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 24 May 2016 15:17:52 +0000 (16:17 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 27 May 2016 12:06:25 +0000 (13:06 +0100)
commitac775bf4d35b7a2d5715e0ccf3d648d4670213fd
tree2a194c3e19f7e27d8fd9fb9ae6a3c130f9eb0dca
parent9d07ebe108f4e11508e350eaf2ba10d7480636fa
gdb: Forward VALUE_LVAL when avoiding side effects for STRUCTOP_PTR

Assume that we have a C program like this:

  struct foo_type
  {
    int var;
  } foo;

  struct foo_type *foo_ptr = &foo;

  int
  main ()
  {
    return foo_ptr->var;
  }

Then GDB should be able to evaluate the following, however, it currently
does not:

  (gdb) start
  ...
  (gdb) whatis &(foo_ptr->var)
  Attempt to take address of value not located in memory.

The problem is that in EVAL_AVOID_SIDE_EFFECTS mode,
eval.c:evaluate_subexp_standard always returns a not_lval value as the
result for a STRUCTOP_PTR operation. As a consequence, the rest of
the code believes that one cannot take the address of the returned
value.

This patch fixes STRUCTOP_PTR handling so that the VALUE_LVAL
attribute for the returned value is properly initialized.  After this
change, the above session becomes:

  (gdb) start
  ...
  (gdb) whatis &(foo_ptr->var)
  type = int *

This commit is largely the same as commit 2520f728b710 (Forward
VALUE_LVAL when avoiding side effects for STRUCTOP_STRUCT) but applied
to STRUCTOP_PTR rather than STRUCTOP_STRUCT.  Both of these commits are
building on top of commit ac1ca910d74d (Fixes for PR exp/15364).

gdb/ChangeLog:

* eval.c (evaluate_subexp_standard): If EVAL_AVOID_SIDE_EFFECTS
mode, forward the VALUE_LVAL attribute to the returned value in
the STRUCTOP_PTR case.

gdb/testsuite/ChangeLog:

* gdb.base/whatis.c: Extend the test case.
* gdb.base/whatis.exp: Add additional tests.
gdb/ChangeLog
gdb/eval.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/whatis.c
gdb/testsuite/gdb.base/whatis.exp