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.
This commit is contained in:
Joel Brobecker 2011-07-01 18:27:35 +00:00
parent d2d43431e8
commit 25552254a3
2 changed files with 16 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-07-01 Joel Brobecker <brobecker@adacore.com>
* 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 <delay@adacore.com>
* ada-typeprint.c (ada_print_type): Fix both PAD type and

View File

@ -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