diff options
author | Daniel Jacobowitz <drow@false.org> | 2009-06-30 15:50:27 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2009-06-30 15:50:27 +0000 |
commit | c38f313db7f8010841c0436444b6bde74004a3a3 (patch) | |
tree | c625d2e5bfda45332909926854a0bb5710f5b4a4 | |
parent | fe56b6cece18680561786b6a2ea7d581e9b27c3e (diff) | |
download | gdb-c38f313db7f8010841c0436444b6bde74004a3a3.zip gdb-c38f313db7f8010841c0436444b6bde74004a3a3.tar.gz gdb-c38f313db7f8010841c0436444b6bde74004a3a3.tar.bz2 |
* dwarf2read.c (inherit_abstract_dies): Work around GCC PR 40573.
testsuite/
* gdb.opt/inline-locals.exp: Remove XFAIL with duplicated arg1.
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 28 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.opt/inline-locals.exp | 28 |
4 files changed, 34 insertions, 30 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 87eddc5..c6ac1f7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2009-06-30 Daniel Jacobowitz <dan@codesourcery.com> + + * dwarf2read.c (inherit_abstract_dies): Work around GCC PR 40573. + 2009-06-30 Vladimir Prus <vladimir@codesourcery.com> * mi/mi-cmd-stack.c (parse_print_values): New. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 218c85a..4b5f195 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 4c000a1..d08158e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-06-30 Daniel Jacobowitz <dan@codesourcery.com> + + * gdb.opt/inline-locals.exp: Remove XFAIL with duplicated arg1. + 2009-06-30 Vladimir Prus <vladimir@codesourcery.com> * 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 cdc180a..f1f58cb 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 = <value optimized out>\r\narg1 = <value optimized out>\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 = <value optimized out>\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 = <value optimized out>\r\narg1 = <value optimized out>\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 = <value optimized out>\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 |