diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 40f6169..5ef00d9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2011-12-30 Doug Evans <dje@google.com> + + * dwarf2read.c (read_typedef): Guard against self-referential typedefs. + 2011-12-28 Jan Kratochvil <jan.kratochvil@redhat.com> * gdbarch.sh (max_insn_length): Extend the comment by unit. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 31ea14e..cee021c 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8836,14 +8836,26 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; const char *name = NULL; - struct type *this_type; + struct type *this_type, *target_type; name = dwarf2_full_name (NULL, die, cu); this_type = init_type (TYPE_CODE_TYPEDEF, 0, TYPE_FLAG_TARGET_STUB, NULL, objfile); TYPE_NAME (this_type) = (char *) name; set_die_type (die, this_type, cu); - TYPE_TARGET_TYPE (this_type) = die_type (die, cu); + target_type = die_type (die, cu); + if (target_type != this_type) + TYPE_TARGET_TYPE (this_type) = target_type; + else + { + /* Self-referential typedefs are, it seems, not allowed by the DWARF + spec and cause infinite loops in GDB. */ + complaint (&symfile_complaints, + _("Self-referential DW_TAG_typedef " + "- DIE at 0x%x [in module %s]"), + die->offset, cu->objfile->name); + TYPE_TARGET_TYPE (this_type) = NULL; + } return this_type; } |