From deede10c775af571f72a37efa5b763b45334b19e Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 29 Aug 2014 19:50:03 +0200 Subject: 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) : 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. --- gdb/ada-lang.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'gdb/ada-lang.c') diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 28999c7..4c6d039 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2715,15 +2715,16 @@ ada_value_subscript (struct value *arr, int arity, struct value **ind) return elt; } -/* Assuming ARR is a pointer to a standard GDB array of type TYPE, the - value of the element of *ARR at the ARITY indices given in - IND. Does not read the entire array into memory. */ +/* Assuming ARR is a pointer to a GDB array, the value of the element + of *ARR at the ARITY indices given in IND. + Does not read the entire array into memory. */ static struct value * -ada_value_ptr_subscript (struct value *arr, struct type *type, int arity, - struct value **ind) +ada_value_ptr_subscript (struct value *arr, int arity, struct value **ind) { int k; + struct type *type + = check_typedef (value_enclosing_type (ada_value_ind (arr))); 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]), nargs, argvec + 1)); case TYPE_CODE_PTR: /* Pointer to array */ - type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1); if (noside == EVAL_AVOID_SIDE_EFFECTS) { + type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1); type = ada_array_element_type (type, nargs); if (type == NULL) 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 - unwrap_value (ada_value_ptr_subscript (argvec[0], type, - nargs, argvec + 1)); + unwrap_value (ada_value_ptr_subscript (argvec[0], + nargs, argvec + 1)); default: error (_("Attempt to index or call something other than an " -- cgit v1.1