diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2016-05-24 16:17:52 +0100 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2016-05-27 13:06:25 +0100 |
commit | ac775bf4d35b7a2d5715e0ccf3d648d4670213fd (patch) | |
tree | 2a194c3e19f7e27d8fd9fb9ae6a3c130f9eb0dca /gdb/testsuite/gdb.base/whatis.c | |
parent | 9d07ebe108f4e11508e350eaf2ba10d7480636fa (diff) | |
download | gdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.zip gdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.tar.gz gdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.tar.bz2 |
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.
Diffstat (limited to 'gdb/testsuite/gdb.base/whatis.c')
-rw-r--r-- | gdb/testsuite/gdb.base/whatis.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gdb/testsuite/gdb.base/whatis.c b/gdb/testsuite/gdb.base/whatis.c index d60afa2..e5cfa51 100644 --- a/gdb/testsuite/gdb.base/whatis.c +++ b/gdb/testsuite/gdb.base/whatis.c @@ -135,7 +135,7 @@ struct t_struct { #endif float v_float_member; double v_double_member; -} v_struct1; +} v_struct1, *v_struct_ptr1; struct { char v_char_member; @@ -147,7 +147,7 @@ struct { #endif float v_float_member; double v_double_member; -} v_struct2; +} v_struct2, *v_struct_ptr2; /**** unions *******/ @@ -161,7 +161,7 @@ union t_union { #endif float v_float_member; double v_double_member; -} v_union; +} v_union, *v_union_ptr; union { char v_char_member; @@ -173,7 +173,7 @@ union { #endif float v_float_member; double v_double_member; -} v_union2; +} v_union2, *v_union_ptr2; /*** Functions returning type ********/ |