mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-23 20:19:49 +00:00
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 commit2520f728b7
(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 commitac1ca910d7
(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.
This commit is contained in:
parent
9d07ebe108
commit
ac775bf4d3
@ -1,3 +1,9 @@
|
||||
2016-05-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2016-05-25 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* python/py-value.c (value_object_as_number): Use correct spelling
|
||||
|
@ -1917,7 +1917,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
|
||||
NULL, "structure pointer");
|
||||
if (noside == EVAL_AVOID_SIDE_EFFECTS)
|
||||
arg3 = value_zero (value_type (arg3), not_lval);
|
||||
arg3 = value_zero (value_type (arg3), VALUE_LVAL (arg3));
|
||||
return arg3;
|
||||
|
||||
case STRUCTOP_MEMBER:
|
||||
|
@ -1,3 +1,8 @@
|
||||
2016-05-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* gdb.base/whatis.c: Extend the test case.
|
||||
* gdb.base/whatis.exp: Add additional tests.
|
||||
|
||||
2016-05-25 Bernhard Heckel <bernhard.heckel@intel.com>
|
||||
|
||||
* gdb.fortran/type.f90: Add pointer variable.
|
||||
|
@ -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 ********/
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user