summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2014-08-29 19:50:03 +0200
committerJoel Brobecker <brobecker@adacore.com>2014-09-10 06:30:58 -0700
commitdeede10c775af571f72a37efa5b763b45334b19e (patch)
treeadf10d9de104d25379715abaf4708aa4a90e92b6 /gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
parent7828a5f5fab040cdc007ce235c4c534aa777067b (diff)
downloadbinutils-gdb-deede10c775af571f72a37efa5b763b45334b19e.tar.gz
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.
Diffstat (limited to 'gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp')
-rw-r--r--gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp104
1 files changed, 104 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
index 501f1290c3b..1df5e3c018d 100644
--- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
+++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
@@ -137,17 +137,121 @@ gdb_test_no_output "set language ada"
gdb_test "print foo.three_ptr.all" \
" = \\(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
gdb_test "print foo.three_ptr_tdef.all" \
" = \\(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
gdb_test "print foo.five_ptr.all" \
" = \\(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
gdb_test "print foo.five_ptr_tdef.all" \
" = \\(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"