aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-valprint.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2014-08-29 17:50:13 +0200
committerJoel Brobecker <brobecker@adacore.com>2014-09-10 06:24:25 -0700
commit7828a5f5fab040cdc007ce235c4c534aa777067b (patch)
tree84b45968bbb2413958e42bc72107387c1efaa3a8 /gdb/ada-valprint.c
parent35782f1465dd014737fcf6c82bdf733598a5c9b8 (diff)
downloadgdb-7828a5f5fab040cdc007ce235c4c534aa777067b.zip
gdb-7828a5f5fab040cdc007ce235c4c534aa777067b.tar.gz
gdb-7828a5f5fab040cdc007ce235c4c534aa777067b.tar.bz2
print PTR.all where PTR is an Ada thin pointer
Consider the following declaration: type Array_Type is array (Natural range <>) of Integer; type Array_Ptr is access all Array_Type; for Array_Ptr'Size use 64; Three_Ptr : Array_Ptr := new Array_Type'(1 => 1, 2 => 2, 3 => 3); This creates a pointer to an array where the bounds are stored in a memory region just before the array itself (aka a "thin pointer"). In DWARF, this is described as a the usual pointer type to an array whose subrange has dynamic values for its bounds: <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 currently printing the value of the array incorrectly: (gdb) p foo.three_ptr.all $1 = (26629472 => 1, 2, value.c:819: internal-error: value_contents_bits_eq: [...] The dereferencing (".all" operator) is done by calling ada_value_ind, which itself calls value_ind. It first produces a new value where the bounds of the array were correctly resolved to their actual value, but then calls readjust_indirect_value_type which replaces the resolved type by the original type. The problem starts when ada_value_print does not take this situation into account, and starts using the type of the resulting value, which has unresolved array bounds, instead of using the value's enclosing type. After fixing this issue, the debugger now correctly prints: (gdb) p foo.three_ptr.all $1 = (1, 2, 3) gdb/ChangeLog: * ada-valprint.c (ada_value_print): Use VAL's enclosing type instead of VAL's type. gdb/testsuite/ChangeLog: * gdb.dwarf2/dynarr-ptr.c: New file. * gdb.dwarf2/dynarr-ptr.exp: New file.
Diffstat (limited to 'gdb/ada-valprint.c')
-rw-r--r--gdb/ada-valprint.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c
index ae07cc21..ade0a65 100644
--- a/gdb/ada-valprint.c
+++ b/gdb/ada-valprint.c
@@ -1171,7 +1171,7 @@ ada_value_print (struct value *val0, struct ui_file *stream,
{
struct value *val = ada_to_fixed_value (val0);
CORE_ADDR address = value_address (val);
- struct type *type = ada_check_typedef (value_type (val));
+ struct type *type = ada_check_typedef (value_enclosing_type (val));
struct value_print_options opts;
/* If it is a pointer, indicate what it points to. */