From 25552254a3f7f70cc36295060b2628f3255d55ad Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 1 Jul 2011 18:27:35 +0000 Subject: [PATCH] crash when printing type of tagged type If the debugging info is incorrect or incomplete, printing the type description of a variable that's a variant tagged type can trigger a crash. The crash comes from us trying print a NULL string which was supposed to be the parent type name. We observed this behavior on bareboard targets where a-tags is not always linked in, as is the case for native platforms, for instance. Coupled with -feliminate-unused-debug-types, this leads to GDB being unable to find type ada__tags__type_specific_data, without which printing the type description above cannot be done acurately. There is an easy workaround for this limitation, which is to compile at least 1 unit with -fno-eliminate-unused-debug-types, but GDB should also be made resilient to this situation. gdb/ChangeLog: * ada-typeprint.c (print_record_type): If unable to decode the name of the parent type, use the encoded name. --- gdb/ChangeLog | 5 +++++ gdb/ada-typeprint.c | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1d1eef5..773f887 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-07-01 Joel Brobecker + + * ada-typeprint.c (print_record_type): If unable to decode + the name of the parent type, use the encoded name. + 2011-07-01 Jean-Charles Delay * ada-typeprint.c (ada_print_type): Fix both PAD type and diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 6bae634..bbcef55 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -621,8 +621,17 @@ print_record_type (struct type *type0, struct ui_file *stream, int show, parent_type = ada_parent_type (type); if (ada_type_name (parent_type) != NULL) - fprintf_filtered (stream, "new %s with record", - decoded_type_name (parent_type)); + { + const char *parent_name = decoded_type_name (parent_type); + + /* If we fail to decode the parent type name, then use the parent + type name as is. Not pretty, but should never happen except + when the debugging info is incomplete or incorrect. This + prevents a crash trying to print a NULL pointer. */ + if (parent_name == NULL) + parent_name = ada_type_name (parent_type); + fprintf_filtered (stream, "new %s with record", parent_name); + } else if (parent_type == NULL && ada_is_tagged_type (type, 0)) fprintf_filtered (stream, "tagged record"); else -- 2.7.4