From 727e3d2e5ca581e75f2d8707c28c5cbd7ee34bb0 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 4 Jan 2008 20:45:05 +0000 Subject: [PATCH] * ada-lang.c (decode_packed_array_type): Avoid a seg fault when the type is an anonymous pointer type. (ada_check_typedef): Avoid a seg fault when the type is null. * ada-typeprint.c (print_array_type): Add support for pointer to packed arrays. --- gdb/ChangeLog | 8 ++++++++ gdb/ada-lang.c | 17 ++++++++++++++--- gdb/ada-typeprint.c | 17 ++++++++++++++--- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ccc112fa08..699a553e26 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2008-01-04 Jerome Guitton + + * ada-lang.c (decode_packed_array_type): Avoid a seg fault + when the type is an anonymous pointer type. + (ada_check_typedef): Avoid a seg fault when the type is null. + * ada-typeprint.c (print_array_type): Add support for pointer + to packed arrays. + 2008-01-04 Paul N. Hilfinger * ada-exp.y: Allow '{type} ADDRESS' notation on left of assignment. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 134244f1d3..198ef62c72 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1809,13 +1809,21 @@ decode_packed_array_type (struct type *type) { struct symbol *sym; struct block **blocks; - const char *raw_name = ada_type_name (ada_check_typedef (type)); - char *name = (char *) alloca (strlen (raw_name) + 1); - char *tail = strstr (raw_name, "___XP"); + char *raw_name = ada_type_name (ada_check_typedef (type)); + char *name; + char *tail; struct type *shadow_type; long bits; int i, n; + if (!raw_name) + raw_name = ada_type_name (desc_base_type (type)); + + if (!raw_name) + return NULL; + + name = (char *) alloca (strlen (raw_name) + 1); + tail = strstr (raw_name, "___XP"); type = desc_base_type (type); memcpy (name, raw_name, tail - raw_name); @@ -7269,6 +7277,9 @@ static_unwrap_type (struct type *type) struct type * ada_check_typedef (struct type *type) { + if (type == NULL) + return NULL; + CHECK_TYPEDEF (type); if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM || !TYPE_STUB (type) diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 7bfb001b7b..4b1f9ffc90 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -366,6 +366,9 @@ print_array_type (struct type *type, struct ui_file *stream, int show, int bitsize; int n_indices; + if (ada_is_packed_array_type (type)) + type = ada_coerce_to_simple_array_type (type); + bitsize = 0; fprintf_filtered (stream, "array ("); @@ -374,8 +377,6 @@ print_array_type (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, "..."); else { - if (ada_is_packed_array_type (type)) - type = ada_coerce_to_simple_array_type (type); if (type == NULL) { fprintf_filtered (stream, _("")); @@ -782,7 +783,17 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream, if (ada_is_aligner_type (type)) ada_print_type (ada_aligned_type (type), "", stream, show, level); else if (ada_is_packed_array_type (type)) - print_array_type (type, stream, show, level); + { + if (TYPE_CODE (type) == TYPE_CODE_PTR) + { + fprintf_filtered (stream, "access "); + print_array_type (TYPE_TARGET_TYPE (type), stream, show, level); + } + else + { + print_array_type (type, stream, show, level); + } + } else switch (TYPE_CODE (type)) {