diff options
author | Joel Brobecker <brobecker@gnat.com> | 2008-01-09 17:01:54 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2008-01-09 17:01:54 +0000 |
commit | ab0d6e0d016a6a05e680037e0277dc21a8dfe7b2 (patch) | |
tree | 6db2adafa137f5a3df01db05ef9be7b63cb7403a /gdb | |
parent | 45664ddbb03f2d1d894706fddfa8e27b67dee25a (diff) | |
download | gdb-ab0d6e0d016a6a05e680037e0277dc21a8dfe7b2.zip gdb-ab0d6e0d016a6a05e680037e0277dc21a8dfe7b2.tar.gz gdb-ab0d6e0d016a6a05e680037e0277dc21a8dfe7b2.tar.bz2 |
* gdbtypes.c (create_array_type): Add handling of null Ada arrays.
(check_typedef): Likewise.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 28 |
2 files changed, 26 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c6c54ec..8caa93a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-01-09 Joel Brobecker <brobecker@adacore.com> + + * gdbtypes.c (create_array_type): Add handling of null Ada arrays. + (check_typedef): Likewise. + 2008-01-09 Luis Machado <luisgpm@br.ibm.com> * printcmd.c (printf_command): Add seen_big_h, seen_big_d and diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 85ccc81..a70b6e4 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -811,8 +811,14 @@ create_array_type (struct type *result_type, if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) low_bound = high_bound = 0; CHECK_TYPEDEF (element_type); - TYPE_LENGTH (result_type) = - TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); + /* Be careful when setting the array length. Ada arrays can be + empty arrays with the high_bound being smaller than the low_bound. + In such cases, the array length should be zero. */ + if (high_bound < low_bound) + TYPE_LENGTH (result_type) = 0; + else + TYPE_LENGTH (result_type) = + TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); TYPE_NFIELDS (result_type) = 1; TYPE_FIELDS (result_type) = (struct field *) TYPE_ALLOC (result_type, sizeof (struct field)); @@ -1492,11 +1498,19 @@ check_typedef (struct type *type) == TYPE_CODE_RANGE)) { /* Now recompute the length of the array type, based on its - number of elements and the target type's length. */ - TYPE_LENGTH (type) = - ((TYPE_FIELD_BITPOS (range_type, 1) - - TYPE_FIELD_BITPOS (range_type, 0) + 1) - * TYPE_LENGTH (target_type)); + number of elements and the target type's length. + Watch out for Ada null Ada arrays where the high bound + is smaller than the low bound. */ + const int low_bound = TYPE_FIELD_BITPOS (range_type, 0); + const int high_bound = TYPE_FIELD_BITPOS (range_type, 1); + int nb_elements; + + if (high_bound < low_bound) + nb_elements = 0; + else + nb_elements = high_bound - low_bound + 1; + + TYPE_LENGTH (type) = nb_elements * TYPE_LENGTH (target_type); TYPE_FLAGS (type) &= ~TYPE_FLAG_TARGET_STUB; } else if (TYPE_CODE (type) == TYPE_CODE_RANGE) |