mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
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:
parent
d2d43431e8
commit
25552254a3
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user