diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/ada-valprint.c | 6 | ||||
-rw-r--r-- | gdb/p-valprint.c | 2 | ||||
-rw-r--r-- | gdb/valprint.c | 49 | ||||
-rw-r--r-- | gdb/valprint.h | 4 |
5 files changed, 32 insertions, 39 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dcb8214..e226bd1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2010-06-03 Pierre Muller <muller@ics.u-strasbg.fr> + + * valprint.h (get_array_bounds): Change low and high parameter types + to LONGEST *. + * valprint.c (get_array_bounds): Use get_discrete_bounds call to + compute bounds. + (val_print_array_elements): Adapt to change above. + * ada-valprint.c (print_optional_low_bound): Adapt to change above. + * p-valprint.c (pascal_val_print): Likewise. + 2010-06-02 Jan Kratochvil <jan.kratochvil@redhat.com> * symfile.c (init_filename_language_table): New extensions .for, .FOR, diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index c56d221..7e93e3a 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -85,8 +85,8 @@ print_optional_low_bound (struct ui_file *stream, struct type *type, const struct value_print_options *options) { struct type *index_type; - long low_bound; - long high_bound; + LONGEST low_bound; + LONGEST high_bound; if (options->print_array_indexes) return 0; @@ -131,7 +131,7 @@ print_optional_low_bound (struct ui_file *stream, struct type *type, break; } - ada_print_scalar (index_type, (LONGEST) low_bound, stream); + ada_print_scalar (index_type, low_bound, stream); fprintf_filtered (stream, " => "); return 1; } diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index 1c2f36d..e58f9d2 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -60,7 +60,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned int i = 0; /* Number of characters printed */ unsigned len; - long low_bound, high_bound; + LONGEST low_bound, high_bound; struct type *elttype; unsigned eltlen; int length_pos, length_size, string_pos; diff --git a/gdb/valprint.c b/gdb/valprint.c index 517e607..2b06579 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1034,44 +1034,27 @@ print_char_chars (struct ui_file *stream, struct type *type, Return 1 if the operation was successful. Return zero otherwise, in which case the values of LOW_BOUND and HIGH_BOUNDS are unmodified. - - Computing the array upper and lower bounds is pretty easy, but this - function does some additional verifications before returning them. - If something incorrect is detected, it is better to return a status - rather than throwing an error, making it easier for the caller to - implement an error-recovery plan. For instance, it may decide to - warn the user that the bounds were not found and then use some - default values instead. */ + + We now simply use get_discrete_bounds call to get the values + of the low and high bounds. + get_discrete_bounds can return three values: + 1, meaning that index is a range, + 0, meaning that index is a discrete type, + or -1 for failure. */ int -get_array_bounds (struct type *type, long *low_bound, long *high_bound) +get_array_bounds (struct type *type, LONGEST *low_bound, LONGEST *high_bound) { struct type *index = TYPE_INDEX_TYPE (type); - long low = 0; - long high = 0; - + LONGEST low = 0; + LONGEST high = 0; + int res; + if (index == NULL) return 0; - if (TYPE_CODE (index) == TYPE_CODE_RANGE) - { - low = TYPE_LOW_BOUND (index); - high = TYPE_HIGH_BOUND (index); - } - else if (TYPE_CODE (index) == TYPE_CODE_ENUM) - { - const int n_enums = TYPE_NFIELDS (index); - - low = TYPE_FIELD_BITPOS (index, 0); - high = TYPE_FIELD_BITPOS (index, n_enums - 1); - } - else - return 0; - - /* Abort if the lower bound is greater than the higher bound, except - when low = high + 1. This is a very common idiom used in Ada when - defining empty ranges (for instance "range 1 .. 0"). */ - if (low > high + 1) + res = get_discrete_bounds (index, &low, &high); + if (res == -1) return 0; if (low_bound) @@ -1126,7 +1109,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, unsigned int rep1; /* Number of repetitions we have detected so far. */ unsigned int reps; - long low_bound_index = 0; + LONGEST low_bound_index = 0; elttype = TYPE_TARGET_TYPE (type); eltlen = TYPE_LENGTH (check_typedef (elttype)); @@ -1141,7 +1124,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, len = TYPE_LENGTH (type) / eltlen; else { - long low, hi; + LONGEST low, hi; if (get_array_bounds (type, &low, &hi)) len = hi - low + 1; diff --git a/gdb/valprint.h b/gdb/valprint.h index 9b8004e..070d796 100644 --- a/gdb/valprint.h +++ b/gdb/valprint.h @@ -109,8 +109,8 @@ extern void get_raw_print_options (struct value_print_options *opts); extern void get_formatted_print_options (struct value_print_options *opts, char format); -extern int get_array_bounds (struct type *type, long *low_bound, - long *high_bound); +extern int get_array_bounds (struct type *type, LONGEST *low_bound, + LONGEST *high_bound); extern void maybe_print_array_index (struct type *index_type, LONGEST index, struct ui_file *stream, |