X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fada-typeprint.c;h=3c33bdcfc46e20c4c3111d43e48f199ed6744033;hb=21122961ecea30b3be7c788e09179d297e3233f0;hp=a43ced7cfb7e34ef43dcbb1ec43801b61d152d85;hpb=6d3d12ebef6fa7dd6bc8c34fbc5e440ac8d0a8c6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index a43ced7cfb..3c33bdcfc4 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -1,5 +1,5 @@ /* Support for printing Ada types for GDB, the GNU debugger. - Copyright (C) 1986-2014 Free Software Foundation, Inc. + Copyright (C) 1986-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -32,9 +32,7 @@ #include "c-lang.h" #include "typeprint.h" #include "ada-lang.h" - #include -#include static int print_selected_record_field_types (struct type *, struct type *, int, int, @@ -66,7 +64,7 @@ decoded_type_name (struct type *type) if (name_buffer == NULL || name_buffer_len <= strlen (raw_name)) { name_buffer_len = 16 + 2 * strlen (raw_name); - name_buffer = xrealloc (name_buffer, name_buffer_len); + name_buffer = (char *) xrealloc (name_buffer, name_buffer_len); } strcpy (name_buffer, raw_name); @@ -117,6 +115,9 @@ type_is_full_subrange_of_target_type (struct type *type) if (subtype == NULL) return 0; + if (is_dynamic_type (type)) + return 0; + if (ada_discrete_type_low_bound (type) != ada_discrete_type_low_bound (subtype)) return 0; @@ -158,15 +159,36 @@ print_range (struct type *type, struct ui_file *stream, case TYPE_CODE_ENUM: { struct type *target_type; + LONGEST lo = 0, hi = 0; /* init for gcc -Wall */ + int got_error = 0; target_type = TYPE_TARGET_TYPE (type); if (target_type == NULL) target_type = type; - ada_print_scalar (target_type, ada_discrete_type_low_bound (type), - stream); - fprintf_filtered (stream, " .. "); - ada_print_scalar (target_type, ada_discrete_type_high_bound (type), - stream); + + TRY + { + lo = ada_discrete_type_low_bound (type); + hi = ada_discrete_type_high_bound (type); + } + CATCH (e, RETURN_MASK_ERROR) + { + /* This can happen when the range is dynamic. Sometimes, + resolving dynamic property values requires us to have + access to an actual object, which is not available + when the user is using the "ptype" command on a type. + Print the range as an unbounded range. */ + fprintf_filtered (stream, "<>"); + got_error = 1; + } + END_CATCH + + if (!got_error) + { + ada_print_scalar (target_type, lo, stream); + fprintf_filtered (stream, " .. "); + ada_print_scalar (target_type, hi, stream); + } } break; default: @@ -181,7 +203,7 @@ print_range (struct type *type, struct ui_file *stream, set *N past the bound and its delimiter, if any. */ static void -print_range_bound (struct type *type, char *bounds, int *n, +print_range_bound (struct type *type, const char *bounds, int *n, struct ui_file *stream) { LONGEST B; @@ -208,8 +230,8 @@ print_range_bound (struct type *type, char *bounds, int *n, else { int bound_len; - char *bound = bounds + *n; - char *pend; + const char *bound = bounds + *n; + const char *pend; pend = strstr (bound, "__"); if (pend == NULL) @@ -278,7 +300,7 @@ print_range_type (struct type *raw_type, struct ui_file *stream, else { int prefix_len = subtype_info - name; - char *bounds_str; + const char *bounds_str; int n; subtype_info += 5; @@ -341,7 +363,7 @@ static void print_fixed_point_type (struct type *type, struct ui_file *stream) { DOUBLEST delta = ada_delta (type); - DOUBLEST small = ada_fixed_to_float (type, 1.0); + DOUBLEST small = ada_fixed_to_float (type, 1); if (delta < 0.0) fprintf_filtered (stream, "delta ??"); @@ -364,6 +386,7 @@ print_array_type (struct type *type, struct ui_file *stream, int show, { int bitsize; int n_indices; + struct type *elt_type = NULL; if (ada_is_constrained_packed_array_type (type)) type = ada_coerce_to_simple_array_type (type); @@ -426,11 +449,15 @@ print_array_type (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", "); } + elt_type = ada_array_element_type (type, n_indices); fprintf_filtered (stream, ") of "); wrap_here (""); - ada_print_type (ada_array_element_type (type, n_indices), "", stream, - show == 0 ? 0 : show - 1, level + 1, flags); - if (bitsize > 0) + ada_print_type (elt_type, "", stream, show == 0 ? 0 : show - 1, level + 1, + flags); + /* Arrays with variable-length elements are never bit-packed in practice but + compilers have to describe their stride so that we can properly fetch + individual elements. Do not say the array is packed in this case. */ + if (bitsize > 0 && !is_dynamic_type (elt_type)) fprintf_filtered (stream, " ", bitsize); }