From c38f313db7f8010841c0436444b6bde74004a3a3 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 30 Jun 2009 15:50:27 +0000 Subject: [PATCH] * dwarf2read.c (inherit_abstract_dies): Work around GCC PR 40573. testsuite/ * gdb.opt/inline-locals.exp: Remove XFAIL with duplicated arg1. --- gdb/ChangeLog | 4 ++++ gdb/dwarf2read.c | 28 +++++++++++++++++++------ gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.opt/inline-locals.exp | 28 ++++--------------------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 87eddc56a7c..c6ac1f79ecf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2009-06-30 Daniel Jacobowitz + + * dwarf2read.c (inherit_abstract_dies): Work around GCC PR 40573. + 2009-06-30 Vladimir Prus * mi/mi-cmd-stack.c (parse_print_values): New. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 218c85a54d9..4b5f1954ccd 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3331,14 +3331,24 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) child_die = die->child; while (child_die && child_die->tag) { - attr = dwarf2_attr (child_die, DW_AT_abstract_origin, cu); + /* For each CHILD_DIE, find the corresponding child of + ORIGIN_DIE. If there is more than one layer of + DW_AT_abstract_origin, follow them all; there shouldn't be, + but GCC versions at least through 4.4 generate this (GCC PR + 40573). */ + struct die_info *child_origin_die = child_die; + while (1) + { + attr = dwarf2_attr (child_origin_die, DW_AT_abstract_origin, cu); + if (attr == NULL) + break; + child_origin_die = follow_die_ref (child_origin_die, attr, &cu); + } + /* According to DWARF3 3.3.8.2 #3 new entries without their abstract counterpart may exist. */ - if (attr) + if (child_origin_die != child_die) { - struct die_info *child_origin_die; - - child_origin_die = follow_die_ref (child_die, attr, &cu); if (child_die->tag != child_origin_die->tag && !(child_die->tag == DW_TAG_inlined_subroutine && child_origin_die->tag == DW_TAG_subprogram)) @@ -3346,7 +3356,13 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) _("Child DIE 0x%x and its abstract origin 0x%x have " "different tags"), child_die->offset, child_origin_die->offset); - *offsets_end++ = child_origin_die->offset; + if (child_origin_die->parent != origin_die) + complaint (&symfile_complaints, + _("Child DIE 0x%x and its abstract origin 0x%x have " + "different parents"), child_die->offset, + child_origin_die->offset); + else + *offsets_end++ = child_origin_die->offset; } child_die = sibling_die (child_die); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4c000a11675..d08158e10d0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-06-30 Daniel Jacobowitz + + * gdb.opt/inline-locals.exp: Remove XFAIL with duplicated arg1. + 2009-06-30 Vladimir Prus * gdb.mi/mi-stack.exp: Testing symbolic options diff --git a/gdb/testsuite/gdb.opt/inline-locals.exp b/gdb/testsuite/gdb.opt/inline-locals.exp index cdc180a7325..f1f58cb7b39 100644 --- a/gdb/testsuite/gdb.opt/inline-locals.exp +++ b/gdb/testsuite/gdb.opt/inline-locals.exp @@ -62,22 +62,9 @@ if { ! $no_frames } { -re "arg1 = $decimal\r\n$gdb_prompt $" { pass $msg } - -re "arg1 = \r\narg1 = \r\n$gdb_prompt $" { - # GCC 4.4 loses location information for arg1 (like GCC - # 4.3) and also generates a strange DIE tree that causes - # us to display the argument twice: inlined func1 has the - # abstract func1 for DW_AT_abstract_origin but its arg1 - # child has the out of line func1's arg1 for - # DW_AT_abstract_origin, with a location list unrelated to - # the inlined instance. - if { [test_compiler_info "gcc-4-4-*"] || [test_compiler_info "gcc-4-5-*"] } { - setup_xfail *-*-* gcc/40573 - } - fail $msg - } -re "arg1 = \r\n$gdb_prompt $" { - # GCC 4.3 loses location information for arg1. GCC 4.2 is OK. - if { [test_compiler_info "gcc-4-3-*"] } { + # GCC 4.3 and later lose location information for arg1. GCC 4.2 is OK. + if { [test_compiler_info "gcc-4-3-*"] || [test_compiler_info "gcc-4-4-*"]} { setup_xfail *-*-* } fail $msg @@ -114,16 +101,9 @@ if { ! $no_frames } { -re "arg1 = $decimal\r\n$gdb_prompt $" { pass $msg } - -re "arg1 = \r\narg1 = \r\n$gdb_prompt $" { - # See the similar GCC 4.4 XFAIL above for an explanation. - if { [test_compiler_info "gcc-4-4-*"] || [test_compiler_info "gcc-4-5-*"] } { - setup_xfail *-*-* gcc/40573 - } - fail $msg - } -re "arg1 = \r\n$gdb_prompt $" { - # GCC 4.3 loses location information for arg1. GCC 4.2 is OK. - if { [test_compiler_info "gcc-4-3-*"] } { + # GCC 4.3 and later lose location information for arg1. GCC 4.2 is OK. + if { [test_compiler_info "gcc-4-3-*"] || [test_compiler_info "gcc-4-4-*"]} { setup_xfail *-*-* } fail $msg -- 2.30.2