aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-01-09 17:01:54 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-01-09 17:01:54 +0000
commitab0d6e0d016a6a05e680037e0277dc21a8dfe7b2 (patch)
tree6db2adafa137f5a3df01db05ef9be7b63cb7403a /gdb
parent45664ddbb03f2d1d894706fddfa8e27b67dee25a (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--gdb/gdbtypes.c28
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)