forked from Imagelibrary/binutils-gdb
Ada subscripting of pointer to array with dynamic bounds
Consider a pointer to an array which dynamic bounds, described in
DWARF as follow:
<1><25>: Abbrev Number: 4 (DW_TAG_array_type)
<26> DW_AT_name : foo__array_type
[...]
<2><3b>: Abbrev Number: 5 (DW_TAG_subrange_type)
[...]
<40> DW_AT_lower_bound : 5 byte block: 97 38 1c 94 4
(DW_OP_push_object_address; DW_OP_lit8; DW_OP_minus;
DW_OP_deref_size: 4)
<46> DW_AT_upper_bound : 5 byte block: 97 34 1c 94 4
(DW_OP_push_object_address; DW_OP_lit4; DW_OP_minus;
DW_OP_deref_size: 4)
GDB is now able to correctly print the entire array, but not one
element of the array. Eg:
(gdb) p foo.three_ptr.all
$1 = (1, 2, 3)
(gdb) p foo.three_ptr.all(1)
Cannot access memory at address 0xfffffffff4123a0c
The problem occurs because we are missing a dynamic resolution of
the variable's array type when subscripting the array. What the current
code does is "fix"-ing the array type using the GNAT encodings, but
that operation ignores any of the array's dynamic properties.
This patch fixes the issue by using ada_value_ind to dereference
the array pointer, which takes care of the array type resolution.
It also continues to "fix" arrays described using GNAT encodings,
so backwards compatibility is preserved.
gdb/ChangeLog:
* ada-lang.c (ada_value_ptr_subscript): Remove parameter "type".
Adjust function implementation and documentation accordingly.
(ada_evaluate_subexp) <OP_FUNCALL>: Only assign "type" if
NOSIDE is EVAL_AVOID_SIDE_EFFECTS.
Update call to ada_value_ptr_subscript.
gdb/testsuite/ChangeLog:
* gdb.dwarf2/dynarr-ptr.exp: Add subscripting tests.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* ada-lang.c (ada_value_ptr_subscript): Remove parameter "type".
|
||||||
|
Adjust function implementation and documentation accordingly.
|
||||||
|
(ada_evaluate_subexp) <OP_FUNCALL>: Only assign "type" if
|
||||||
|
NOSIDE is EVAL_AVOID_SIDE_EFFECTS.
|
||||||
|
Update call to ada_value_ptr_subscript.
|
||||||
|
|
||||||
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* ada-valprint.c (ada_value_print): Use VAL's enclosing type
|
* ada-valprint.c (ada_value_print): Use VAL's enclosing type
|
||||||
|
|||||||
@@ -2715,15 +2715,16 @@ ada_value_subscript (struct value *arr, int arity, struct value **ind)
|
|||||||
return elt;
|
return elt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Assuming ARR is a pointer to a standard GDB array of type TYPE, the
|
/* Assuming ARR is a pointer to a GDB array, the value of the element
|
||||||
value of the element of *ARR at the ARITY indices given in
|
of *ARR at the ARITY indices given in IND.
|
||||||
IND. Does not read the entire array into memory. */
|
Does not read the entire array into memory. */
|
||||||
|
|
||||||
static struct value *
|
static struct value *
|
||||||
ada_value_ptr_subscript (struct value *arr, struct type *type, int arity,
|
ada_value_ptr_subscript (struct value *arr, int arity, struct value **ind)
|
||||||
struct value **ind)
|
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
|
struct type *type
|
||||||
|
= check_typedef (value_enclosing_type (ada_value_ind (arr)));
|
||||||
|
|
||||||
for (k = 0; k < arity; k += 1)
|
for (k = 0; k < arity; k += 1)
|
||||||
{
|
{
|
||||||
@@ -10323,9 +10324,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
|
|||||||
(ada_coerce_to_simple_array (argvec[0]),
|
(ada_coerce_to_simple_array (argvec[0]),
|
||||||
nargs, argvec + 1));
|
nargs, argvec + 1));
|
||||||
case TYPE_CODE_PTR: /* Pointer to array */
|
case TYPE_CODE_PTR: /* Pointer to array */
|
||||||
type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
|
|
||||||
if (noside == EVAL_AVOID_SIDE_EFFECTS)
|
if (noside == EVAL_AVOID_SIDE_EFFECTS)
|
||||||
{
|
{
|
||||||
|
type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
|
||||||
type = ada_array_element_type (type, nargs);
|
type = ada_array_element_type (type, nargs);
|
||||||
if (type == NULL)
|
if (type == NULL)
|
||||||
error (_("element type of array unknown"));
|
error (_("element type of array unknown"));
|
||||||
@@ -10333,8 +10334,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
|
|||||||
return value_zero (ada_aligned_type (type), lval_memory);
|
return value_zero (ada_aligned_type (type), lval_memory);
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
unwrap_value (ada_value_ptr_subscript (argvec[0], type,
|
unwrap_value (ada_value_ptr_subscript (argvec[0],
|
||||||
nargs, argvec + 1));
|
nargs, argvec + 1));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error (_("Attempt to index or call something other than an "
|
error (_("Attempt to index or call something other than an "
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* gdb.dwarf2/dynarr-ptr.exp: Add subscripting tests.
|
||||||
|
|
||||||
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
2014-09-10 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* gdb.dwarf2/dynarr-ptr.c: New file.
|
* gdb.dwarf2/dynarr-ptr.c: New file.
|
||||||
|
|||||||
@@ -137,17 +137,121 @@ gdb_test_no_output "set language ada"
|
|||||||
gdb_test "print foo.three_ptr.all" \
|
gdb_test "print foo.three_ptr.all" \
|
||||||
" = \\(1, 2, 3\\)"
|
" = \\(1, 2, 3\\)"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr.all(1)" \
|
||||||
|
" = 1"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr.all(2)" \
|
||||||
|
" = 2"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr.all(3)" \
|
||||||
|
" = 3"
|
||||||
|
|
||||||
|
# foo.three_ptr
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr(1)" \
|
||||||
|
" = 1"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr(2)" \
|
||||||
|
" = 2"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr(3)" \
|
||||||
|
" = 3"
|
||||||
|
|
||||||
# foo.three_ptr_tdef.all
|
# foo.three_ptr_tdef.all
|
||||||
|
|
||||||
gdb_test "print foo.three_ptr_tdef.all" \
|
gdb_test "print foo.three_ptr_tdef.all" \
|
||||||
" = \\(1, 2, 3\\)"
|
" = \\(1, 2, 3\\)"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef.all(1)" \
|
||||||
|
" = 1"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef.all(2)" \
|
||||||
|
" = 2"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef.all(3)" \
|
||||||
|
" = 3"
|
||||||
|
|
||||||
|
# foo.three_ptr_tdef
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef(1)" \
|
||||||
|
" = 1"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef(2)" \
|
||||||
|
" = 2"
|
||||||
|
|
||||||
|
gdb_test "print foo.three_ptr_tdef(3)" \
|
||||||
|
" = 3"
|
||||||
|
|
||||||
# foo.five_ptr.all
|
# foo.five_ptr.all
|
||||||
|
|
||||||
gdb_test "print foo.five_ptr.all" \
|
gdb_test "print foo.five_ptr.all" \
|
||||||
" = \\(2 => 5, 8, 13, 21, 34\\)"
|
" = \\(2 => 5, 8, 13, 21, 34\\)"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr.all(2)" \
|
||||||
|
" = 5"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr.all(3)" \
|
||||||
|
" = 8"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr.all(4)" \
|
||||||
|
" = 13"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr.all(5)" \
|
||||||
|
" = 21"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr.all(6)" \
|
||||||
|
" = 34"
|
||||||
|
|
||||||
|
# foo.five_ptr
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr(2)" \
|
||||||
|
" = 5"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr(3)" \
|
||||||
|
" = 8"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr(4)" \
|
||||||
|
" = 13"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr(5)" \
|
||||||
|
" = 21"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr(6)" \
|
||||||
|
" = 34"
|
||||||
|
|
||||||
# foo.five_ptr_tdef.all
|
# foo.five_ptr_tdef.all
|
||||||
|
|
||||||
gdb_test "print foo.five_ptr_tdef.all" \
|
gdb_test "print foo.five_ptr_tdef.all" \
|
||||||
" = \\(2 => 5, 8, 13, 21, 34\\)"
|
" = \\(2 => 5, 8, 13, 21, 34\\)"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef.all(2)" \
|
||||||
|
" = 5"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef.all(3)" \
|
||||||
|
" = 8"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef.all(4)" \
|
||||||
|
" = 13"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef.all(5)" \
|
||||||
|
" = 21"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef.all(6)" \
|
||||||
|
" = 34"
|
||||||
|
|
||||||
|
# foo.five_ptr_tdef
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef(2)" \
|
||||||
|
" = 5"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef(3)" \
|
||||||
|
" = 8"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef(4)" \
|
||||||
|
" = 13"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef(5)" \
|
||||||
|
" = 21"
|
||||||
|
|
||||||
|
gdb_test "print foo.five_ptr_tdef(6)" \
|
||||||
|
" = 34"
|
||||||
|
|||||||
Reference in New Issue
Block a user