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.exp | |
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.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/whatis.exp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/whatis.exp b/gdb/testsuite/gdb.base/whatis.exp index 93a4d44..0cdcf5b 100644 --- a/gdb/testsuite/gdb.base/whatis.exp +++ b/gdb/testsuite/gdb.base/whatis.exp @@ -294,6 +294,47 @@ gdb_test "whatis v_struct2" \ "type = struct \{\.\.\.\}" \ "whatis unnamed structure" +gdb_test "whatis &v_struct1" \ + "type = struct t_struct \\*" + +gdb_test "whatis &v_struct2" \ + "type = struct {\\.\\.\\.} \\*" + +gdb_test "whatis v_struct_ptr1" \ + "type = struct t_struct \\*" + +gdb_test "whatis v_struct_ptr2" \ + "type = struct {\\.\\.\\.} \\*" + +gdb_test "whatis &v_struct_ptr1" \ + "type = struct t_struct \\*\\*" + +gdb_test "whatis &v_struct_ptr2" \ + "type = struct {\\.\\.\\.} \\*\\*" + +gdb_test "whatis v_struct1.v_char_member" \ + "type = char" + +gdb_test "whatis v_struct2.v_char_member" \ + "type = char" + +gdb_test "whatis v_struct_ptr1->v_char_member" \ + "type = char" + +gdb_test "whatis v_struct_ptr2->v_char_member" \ + "type = char" + +gdb_test "whatis &(v_struct1.v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_struct2.v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_struct_ptr1->v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_struct_ptr2->v_char_member)" \ + "type = char \\*" # test whatis command with union types gdb_test "whatis v_union" \ @@ -308,6 +349,48 @@ gdb_test "whatis v_union2" \ "type = union \{\.\.\.\}" \ "whatis unnamed union" +gdb_test "whatis &v_union" \ + "type = union t_union \\*" + +gdb_test "whatis &v_union2" \ + "type = union {\\.\\.\\.} \\*" + +gdb_test "whatis v_union_ptr" \ + "type = union t_union \\*" + +gdb_test "whatis v_union_ptr2" \ + "type = union {\\.\\.\\.} \\*" + +gdb_test "whatis &v_union_ptr" \ + "type = union t_union \\*\\*" + +gdb_test "whatis &v_union_ptr2" \ + "type = union {\\.\\.\\.} \\*\\*" + +gdb_test "whatis v_union.v_char_member" \ + "type = char" + +gdb_test "whatis v_union2.v_char_member" \ + "type = char" + +gdb_test "whatis v_union_ptr->v_char_member" \ + "type = char" + +gdb_test "whatis v_union_ptr2->v_char_member" \ + "type = char" + +gdb_test "whatis &(v_union.v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_union2.v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_union_ptr->v_char_member)" \ + "type = char \\*" + +gdb_test "whatis &(v_union_ptr2->v_char_member)" \ + "type = char \\*" + # Using stabs we will mark these functions as prototyped. This # is harmless but causes an extra VOID to be printed. |