aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2011-02-17 06:42:57 +0000
committerJoel Brobecker <brobecker@gnat.com>2011-02-17 06:42:57 +0000
commite67ad678a1e75d69343e4270305c3bf390922362 (patch)
treede842fb23809a9fb5cd399a571e1bc71dd972a9b /gdb/ada-lang.c
parent93084bcabb5f23c509734a202f5a45201b723657 (diff)
downloadgdb-e67ad678a1e75d69343e4270305c3bf390922362.zip
gdb-e67ad678a1e75d69343e4270305c3bf390922362.tar.gz
gdb-e67ad678a1e75d69343e4270305c3bf390922362.tar.bz2
[Ada] Fix unconstrained packed array size
When ada-lang transforms an array descriptor type (an XUP structure) into an array type, the size of the array type is computed by using the element size, and multiplying it by the number of elements in that array. This does not work, however, for packed arrays, where the *packed* size in bits needs to be used. This usually does not cause any problem, because we end up reading more memory than needed. However, we have observed on LynxOS a memory error while trying to read the entire array, because the larger-than-needed read tried to read past the end of the stack into inaccessible memory. This patch fixes the problem by correctly computing the array size in bytes in the case of packed arrays. gdb/ChangeLog: * ada-lang.c (ada_type_of_array): Fix the size of the array in the case of an unconstrained packed array. gdb/testsuite/ChangeLog: * gdb.ada/packed_array: Expand testcase to test printing of unconstrained packed array.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 890e091..467e4df 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -1823,8 +1823,25 @@ ada_type_of_array (struct value *arr, int bounds)
elt_type = create_array_type (array_type, elt_type, range_type);
if (ada_is_unconstrained_packed_array_type (value_type (arr)))
- TYPE_FIELD_BITSIZE (elt_type, 0) =
- decode_packed_array_bitsize (value_type (arr));
+ {
+ /* We need to store the element packed bitsize, as well as
+ recompute the array size, because it was previously
+ computed based on the unpacked element size. */
+ LONGEST lo = value_as_long (low);
+ LONGEST hi = value_as_long (high);
+
+ TYPE_FIELD_BITSIZE (elt_type, 0) =
+ decode_packed_array_bitsize (value_type (arr));
+ /* If the array has no element, then the size is already
+ zero, and does not need to be recomputed. */
+ if (lo < hi)
+ {
+ int array_bitsize =
+ (hi - lo + 1) * TYPE_FIELD_BITSIZE (elt_type, 0);
+
+ TYPE_LENGTH (array_type) = (array_bitsize + 7) / 8;
+ }
+ }
}
return lookup_pointer_type (elt_type);