diff options
author | Joel Brobecker <brobecker@gnat.com> | 2010-10-01 16:25:00 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2010-10-01 16:25:00 +0000 |
commit | 05e522ef517a67b2c47e04e7c11f7897c569dae6 (patch) | |
tree | a4504b832e83df2d0c0cbdaf601fe4fab0aac2a7 /gdb/ada-lang.c | |
parent | 49a45ecfd229b6ed70c9c816e143995e8d9e0bb2 (diff) | |
download | gdb-05e522ef517a67b2c47e04e7c11f7897c569dae6.zip gdb-05e522ef517a67b2c47e04e7c11f7897c569dae6.tar.gz gdb-05e522ef517a67b2c47e04e7c11f7897c569dae6.tar.bz2 |
[Ada] array and bounds in fat pointer can be a stub
This patch adds handling of the case when a fat pointer has the
P_ARRAY and/or P_BOUNDS fields defined as a stub. In that case,
this stub needs to be resolved.
There are two issues:
. First, making sure that the resolution takes place itself.
That's the change to ada_check_typedef.
. Make sure that the type returned after resolution is not itself
a typedef. This is the change to ada_check_typedef.
gdb/ChangeLog (Jerome Guitton, Joel Brobecker):
* ada-lang.c (desc_bounds): Add handling of the case where
the P_BOUNDS field is a pointer to a stub.
(desc_data_target_type): Same for P_ARRAY field.
(ada_check_typedef): Strip the typedef layers from the type
found by ada_find_any_type.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r-- | gdb/ada-lang.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 3eaf649..173e901 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1491,8 +1491,26 @@ desc_bounds (struct value *arr) } else if (is_thick_pntr (type)) - return value_struct_elt (&arr, NULL, "P_BOUNDS", NULL, - _("Bad GNAT array descriptor")); + { + struct value *p_bounds = value_struct_elt (&arr, NULL, "P_BOUNDS", NULL, + _("Bad GNAT array descriptor")); + struct type *p_bounds_type = value_type (p_bounds); + + if (p_bounds_type + && TYPE_CODE (p_bounds_type) == TYPE_CODE_PTR) + { + struct type *target_type = TYPE_TARGET_TYPE (p_bounds_type); + + if (TYPE_STUB (target_type)) + p_bounds = value_cast (lookup_pointer_type + (ada_check_typedef (target_type)), + p_bounds); + } + else + error (_("Bad GNAT array descriptor")); + + return p_bounds; + } else return NULL; } @@ -1539,7 +1557,7 @@ desc_data_target_type (struct type *type) if (data_type && TYPE_CODE (ada_check_typedef (data_type)) == TYPE_CODE_PTR) - return TYPE_TARGET_TYPE (data_type); + return ada_check_typedef (TYPE_TARGET_TYPE (data_type)); } return NULL; @@ -7636,7 +7654,15 @@ ada_check_typedef (struct type *type) char *name = TYPE_TAG_NAME (type); struct type *type1 = ada_find_any_type (name); - return (type1 == NULL) ? type : type1; + if (type1 == NULL) + return type; + + /* TYPE1 might itself be a TYPE_CODE_TYPEDEF (this can happen with + stubs pointing to arrays, as we don't create symbols for array + types, only for the typedef-to-array types). This is why + we process TYPE1 with ada_check_typedef before returning + the result. */ + return ada_check_typedef (type1); } } |