Forward VALUE_LVAL when avoiding side effects for STRUCTOP_STRUCT
Assume foo_array is a pointer to a C structure. GDB must evaluate the following expression properly, but it does not currently: (gdb) print 1 && &foo_array[1].a 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_STRUCT operation. As a consequence, the rest of the code believes that one cannot take the address of the returned value. This patch fixes STRUCTOP_STRUCT handling so that the VALUE_LVAL attribute for the returned value is properly initialized. After this change, the above session becomes: (gdb) print 1 && &foo_array[1].a $1 = 1 gdb/ChangeLog: * eval.c (evaluate_subexp_standard) <STRUCTOP_STRUCT>: If EVAL_AVOID_SIDE_EFFECTS mode, forward the VALUE_LVAL attribute to the returned value. gdb/testsuite/ChangeLog: * gdb.base/nested-addr.c: New file. * gdb.base/nested-addr.exp: New testcase. Tested on x86_64-linux, no regression.
This commit is contained in:
parent
431ff0756a
commit
2520f728b7
@ -1,3 +1,9 @@
|
||||
2015-10-12 Pierre-Marie de Rodat <derodat@adacore.com>
|
||||
|
||||
* eval.c (evaluate_subexp_standard) <STRUCTOP_STRUCT>: If
|
||||
EVAL_AVOID_SIDE_EFFECTS mode, forward the VALUE_LVAL attribute
|
||||
to the returned value.
|
||||
|
||||
2015-10-09 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* ada-lang.c (ada_unpack_from_contents): Add guard that unpacked
|
||||
|
@ -1862,7 +1862,7 @@ evaluate_subexp_standard (struct type *expect_type,
|
||||
arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
|
||||
NULL, "structure");
|
||||
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_PTR:
|
||||
|
@ -1,3 +1,8 @@
|
||||
2015-10-12 Pierre-Marie de Rodat <derodat@adacore.com>
|
||||
|
||||
* gdb.base/nested-addr.c: New file.
|
||||
* gdb.base/nested-addr.exp: New testcase.
|
||||
|
||||
2015-10-09 Markus Metzger <markus.t.metzger@intel.com>
|
||||
|
||||
* gdb.btrace/vdso.c (main): Remove breakpoint markers.
|
||||
|
35
gdb/testsuite/gdb.base/nested-addr.c
Normal file
35
gdb/testsuite/gdb.base/nested-addr.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2015 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct foo
|
||||
{
|
||||
int a;
|
||||
int b;
|
||||
} foo;
|
||||
|
||||
static foo *foo_array = NULL;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
foo_array = calloc (3, sizeof (*foo_array));
|
||||
foo_array[1].a = 10;
|
||||
foo_array[2].b = 20;
|
||||
return 0; /* BREAK */
|
||||
}
|
34
gdb/testsuite/gdb.base/nested-addr.exp
Normal file
34
gdb/testsuite/gdb.base/nested-addr.exp
Normal file
@ -0,0 +1,34 @@
|
||||
# Copyright 2015 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
standard_testfile
|
||||
|
||||
if {[prepare_for_testing "${testfile}.exp" "${testfile}" "${srcfile}"]} {
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![runto_main] {
|
||||
return -1
|
||||
}
|
||||
|
||||
gdb_breakpoint [gdb_get_line_number "BREAK"]
|
||||
gdb_continue_to_breakpoint "BREAK"
|
||||
|
||||
# Sanity checking:
|
||||
gdb_test "print &foo_array\[1\].a" "= \\(int \\*\\) $hex.*"
|
||||
|
||||
# A bug in EVAL_AVOID_SIDE_EFFECTS mode used to yield the following error:
|
||||
# Attempt to take address of value not located in memory.
|
||||
gdb_test "print 1 && &foo_array\[1\].a" "= 1"
|
Loading…
Reference in New Issue
Block a user