Thank you very much Doug.Nice job. ÓÚ 2014Äê02ÔÂ19ÈÕ 14:48, Doug Evans дµÀ: > Joel Brobecker writes: >>> I am not really familiar with these routines,please help me with that. >>> Thank you. >> OK - Doug and I will take care of it. >> >> For the record, I have created the PR. >> https://sourceware.org/bugzilla/show_bug.cgi?id=16581 > Hi. > Sorry for the delay! > I spent some time looking for a cleverer patch, but in the end I think the > simplicity of this patch is nice. > > 2014-02-18 lin zuojian > Joel Brobecker > Doug Evans > > PR symtab/16581 > * dwarf2read.c (struct die_info): New member in_process. > (reset_die_in_process): New function. > (process_die): Set it at the start, reset when returning. > (inherit_abstract_dies): Only call process_die if origin_child_die > not already being processed. > > testsuite/ > * gdb.dwarf2/dw2-icycle.S: New file. > * gdb.dwarf2/dw2-icycle.c: New file. > * gdb.dwarf2/dw2-icycle.exp: New file. > > diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c > index 54c538a..d7f893d 100644 > --- a/gdb/dwarf2read.c > +++ b/gdb/dwarf2read.c > @@ -1225,6 +1225,9 @@ struct die_info > type derived from this DIE. */ > unsigned char building_fullname : 1; > > + /* True if this die is in process. PR 16581. */ > + unsigned char in_process : 1; > + > /* Abbrev number */ > unsigned int abbrev; > > @@ -8008,11 +8011,28 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu) > } > } > > +/* Reset the in_process bit of a die. */ > + > +static void > +reset_die_in_process (void *arg) > +{ > + struct die_info *die = arg; > + die->in_process = 0; > +} > + > /* Process a die and its children. */ > > static void > process_die (struct die_info *die, struct dwarf2_cu *cu) > { > + struct cleanup *in_process; > + > + /* We should only be processing those not already in process. */ > + gdb_assert (!die->in_process); > + > + die->in_process = 1; > + in_process = make_cleanup (reset_die_in_process,die); > + > switch (die->tag) > { > case DW_TAG_padding: > @@ -8100,6 +8120,8 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) > new_symbol (die, NULL, cu); > break; > } > + > + do_cleanups (in_process); > } > > /* DWARF name computation. */ > @@ -10967,8 +10989,12 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) > if (offsetp >= offsets_end > || offsetp->sect_off > origin_child_die->offset.sect_off) > { > - /* Found that ORIGIN_CHILD_DIE is really not referenced. */ > - process_die (origin_child_die, origin_cu); > + /* Found that ORIGIN_CHILD_DIE is really not referenced. > + Check whether we're already processing ORIGIN_CHILD_DIE. > + This can happen with mutually referenced abstract_origins. > + PR 16581. */ > + if (!origin_child_die->in_process) > + process_die (origin_child_die, origin_cu); > } > origin_child_die = sibling_die (origin_child_die); > } > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-icycle.S b/gdb/testsuite/gdb.dwarf2/dw2-icycle.S > new file mode 100644 > index 0000000..6bc533a > --- /dev/null > +++ b/gdb/testsuite/gdb.dwarf2/dw2-icycle.S > @@ -0,0 +1,258 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2014 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see . */ > + > + .text > + > +.Ltext0: > + .type p__top__middle__inside.3062, @function > +p__top__middle__inside.3062: > +.LFB4: > + .file 1 "p.adb" > + .4byte 0 > +.LBE6: > + > + .globl p__top > + .type p__top, @function > +p__top: > +.LFB2: > + .4byte 0 > +.LFE2: > +.Letext0: > + > + .section .debug_info,"",@progbits > +.Ldebug_info0: > + .4byte .Ledebug_info0 - .Lsdebug_info0 /* Length of CU Info */ > +.Lsdebug_info0: > + .2byte 0x4 /* DWARF version number */ > + .4byte .Ldebug_abbrev0 /* Offset Into Abbrev. Section */ > + .byte 0x4 /* Pointer Size (in bytes) */ > + .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */ > + .ascii "GNU Ada 4.9.0 20140126\0" /* DW_AT_producer */ > + .byte 0xd /* DW_AT_language */ > + .ascii "p.adb\0" /* DW_AT_name */ > + .ascii "/tmp\0" /* DW_AT_comp_dir */ > + .4byte .Ltext0 /* DW_AT_low_pc */ > + .4byte .Letext0-.Ltext0 /* DW_AT_high_pc */ > +.S0x142: > + .uleb128 0x8 /* (DIE (0x142) DW_TAG_base_type) */ > + .byte 0x4 /* DW_AT_byte_size */ > + .byte 0x5 /* DW_AT_encoding */ > + .ascii "integer\0" /* DW_AT_name */ > + > + .uleb128 0x13 /* (DIE (0x1b4) DW_TAG_subprogram) */ > + /* DW_AT_external */ > + .ascii "p__top\0" /* DW_AT_name */ > + .byte 0x1 /* DW_AT_decl_file (p.adb) */ > + .byte 0x3 /* DW_AT_decl_line */ > + .4byte .LFB2 /* DW_AT_low_pc */ > + .4byte .LFE2-.LFB2 /* DW_AT_high_pc */ > + .uleb128 0x1 /* DW_AT_frame_base */ > + .byte 0x9c /* DW_OP_call_frame_cfa */ > + /* DW_AT_GNU_all_call_sites */ > + .4byte .S0x4fc - .Ldebug_info0 /* DW_AT_sibling */ > +.S0x1e0: > + .uleb128 0x15 /* (DIE (0x1e0) DW_TAG_subprogram) */ > + .ascii "p__top__middle\0" /* DW_AT_name */ > + .byte 0x1 /* DW_AT_decl_file (p.adb) */ > + .byte 0x4 /* DW_AT_decl_line */ > + .byte 0x1 /* DW_AT_inline */ > + .4byte .S0x374 - .Ldebug_info0 /* DW_AT_sibling */ > +.S0x202: > + .uleb128 0x15 /* (DIE (0x202) DW_TAG_subprogram) */ > + .ascii "p__top__middle__inside\0" /* DW_AT_name */ > + .byte 0x1 /* DW_AT_decl_file (p.adb) */ > + .byte 0x5 /* DW_AT_decl_line */ > + .byte 0x1 /* DW_AT_inline */ > + .4byte .S0x225 - .Ldebug_info0 /* DW_AT_sibling */ > + .byte 0 /* end of children of DIE 0x202 */ > +.S0x225: > + .uleb128 0x18 /* (DIE (0x225) DW_TAG_subprogram) */ > + .4byte .S0x202 - .Ldebug_info0 /* DW_AT_abstract_origin */ > + .4byte .LFB4 /* DW_AT_low_pc */ > + .4byte .LBE6-.LFB4 /* DW_AT_high_pc */ > + .uleb128 0x1 /* DW_AT_frame_base */ > + .byte 0x9c /* DW_OP_call_frame_cfa */ > + .uleb128 0x1 /* DW_AT_static_link */ > + .byte 0x56 /* DW_OP_reg6 */ > + /* DW_AT_GNU_all_call_sites */ > + .uleb128 0x1a /* (DIE (0x247) DW_TAG_inlined_subroutine) */ > + .4byte .S0x1e0 - .Ldebug_info0 /* DW_AT_abstract_origin */ > + .4byte .LFB4 /* DW_AT_low_pc */ > + .4byte .LBE6-.LFB4 /* DW_AT_high_pc */ > + .byte 0x1 /* DW_AT_call_file (p.adb) */ > + .byte 0x14 /* DW_AT_call_line */ > + .4byte .S0x374 - .Ldebug_info0 /* DW_AT_sibling */ > + .byte 0 /* end of children of DIE 0x247 */ > + .byte 0 /* end of children of DIE 0x225 */ > + .byte 0 /* end of children of DIE 0x1e0 */ > +.S0x374: > + .uleb128 0x23 /* (DIE (0x382) DW_TAG_inlined_subroutine) */ > + .4byte .S0x1e0 - .Ldebug_info0 /* DW_AT_abstract_origin */ > + .4byte .LFB4 /* DW_AT_low_pc */ > + .4byte .LBE6-.LFB4 /* DW_AT_high_pc */ > + .byte 0x1 /* DW_AT_call_file (p.adb) */ > + .byte 0x1d /* DW_AT_call_line */ > + .byte 0 /* end of children of DIE 0x382 */ > + .byte 0 /* end of children of DIE 0x1b4 */ > +.S0x4fc: > + .uleb128 0x28 /* (DIE (0x52e) DW_TAG_subprogram) */ > + /* DW_AT_external */ > + .ascii "__gnat_rcheck_PE_Explicit_Raise\0" /* DW_AT_name */ > + /* DW_AT_artificial */ > + /* DW_AT_declaration */ > + .byte 0 /* end of children of DIE 0x52e */ > + .byte 0 /* end of children of DIE 0xb */ > +.Ledebug_info0: > + > + .section .debug_abbrev,"",@progbits > +.Ldebug_abbrev0: > + .uleb128 0x1 /* (abbrev code) */ > + .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x25 /* (DW_AT_producer) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x13 /* (DW_AT_language) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x3 /* (DW_AT_name) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x1b /* (DW_AT_comp_dir) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x11 /* (DW_AT_low_pc) */ > + .uleb128 0x1 /* (DW_FORM_addr) */ > + .uleb128 0x12 /* (DW_AT_high_pc) */ > + .uleb128 0x6 /* (DW_FORM_data4) */ > + .byte 0 > + .byte 0 > + .uleb128 0x8 /* (abbrev code) */ > + .uleb128 0x24 /* (TAG: DW_TAG_base_type) */ > + .byte 0 /* DW_children_no */ > + .uleb128 0xb /* (DW_AT_byte_size) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x3e /* (DW_AT_encoding) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x3 /* (DW_AT_name) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .byte 0 > + .byte 0 > + .uleb128 0x13 /* (abbrev code) */ > + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x3f /* (DW_AT_external) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .uleb128 0x3 /* (DW_AT_name) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x3a /* (DW_AT_decl_file) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x3b /* (DW_AT_decl_line) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x11 /* (DW_AT_low_pc) */ > + .uleb128 0x1 /* (DW_FORM_addr) */ > + .uleb128 0x12 /* (DW_AT_high_pc) */ > + .uleb128 0x6 /* (DW_FORM_data4) */ > + .uleb128 0x40 /* (DW_AT_frame_base) */ > + .uleb128 0x18 /* (DW_FORM_exprloc) */ > + .uleb128 0x2117 /* (DW_AT_GNU_all_call_sites) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .uleb128 0x1 /* (DW_AT_sibling) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .byte 0 > + .byte 0 > + .uleb128 0x15 /* (abbrev code) */ > + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x3 /* (DW_AT_name) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x3a /* (DW_AT_decl_file) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x3b /* (DW_AT_decl_line) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x20 /* (DW_AT_inline) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x1 /* (DW_AT_sibling) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .byte 0 > + .byte 0 > + .uleb128 0x18 /* (abbrev code) */ > + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x31 /* (DW_AT_abstract_origin) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .uleb128 0x11 /* (DW_AT_low_pc) */ > + .uleb128 0x1 /* (DW_FORM_addr) */ > + .uleb128 0x12 /* (DW_AT_high_pc) */ > + .uleb128 0x6 /* (DW_FORM_data4) */ > + .uleb128 0x40 /* (DW_AT_frame_base) */ > + .uleb128 0x18 /* (DW_FORM_exprloc) */ > + .uleb128 0x48 /* (DW_AT_static_link) */ > + .uleb128 0x18 /* (DW_FORM_exprloc) */ > + .uleb128 0x2117 /* (DW_AT_GNU_all_call_sites) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .byte 0 > + .byte 0 > + .uleb128 0x1a /* (abbrev code) */ > + .uleb128 0x1d /* (TAG: DW_TAG_inlined_subroutine) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x31 /* (DW_AT_abstract_origin) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .uleb128 0x11 /* (DW_AT_low_pc) */ > + .uleb128 0x1 /* (DW_FORM_addr) */ > + .uleb128 0x12 /* (DW_AT_high_pc) */ > + .uleb128 0x6 /* (DW_FORM_data4) */ > + .uleb128 0x58 /* (DW_AT_call_file) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x59 /* (DW_AT_call_line) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x1 /* (DW_AT_sibling) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .byte 0 > + .byte 0 > + .uleb128 0x23 /* (abbrev code) */ > + .uleb128 0x1d /* (TAG: DW_TAG_inlined_subroutine) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x31 /* (DW_AT_abstract_origin) */ > + .uleb128 0x13 /* (DW_FORM_ref4) */ > + .uleb128 0x11 /* (DW_AT_low_pc) */ > + .uleb128 0x1 /* (DW_FORM_addr) */ > + .uleb128 0x12 /* (DW_AT_high_pc) */ > + .uleb128 0x6 /* (DW_FORM_data4) */ > + .uleb128 0x58 /* (DW_AT_call_file) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .uleb128 0x59 /* (DW_AT_call_line) */ > + .uleb128 0xb /* (DW_FORM_data1) */ > + .byte 0 > + .byte 0 > + .uleb128 0x28 /* (abbrev code) */ > + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ > + .byte 0x1 /* DW_children_yes */ > + .uleb128 0x3f /* (DW_AT_external) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .uleb128 0x3 /* (DW_AT_name) */ > + .uleb128 0x8 /* (DW_FORM_string) */ > + .uleb128 0x34 /* (DW_AT_artificial) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .uleb128 0x3c /* (DW_AT_declaration) */ > + .uleb128 0x19 /* (DW_FORM_flag_present) */ > + .byte 0 > + .byte 0 > + .byte 0 > + .byte 0 > + .byte 0 > + > + .section .debug_line > +.Lline1_begin: > + .byte 0 > + > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-icycle.c b/gdb/testsuite/gdb.dwarf2/dw2-icycle.c > new file mode 100644 > index 0000000..3ddd194 > --- /dev/null > +++ b/gdb/testsuite/gdb.dwarf2/dw2-icycle.c > @@ -0,0 +1,24 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2004-2014 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see . */ > + > +/* Dummy main function. */ > + > +int > +main() > +{ > + return 0; > +} > diff --git a/gdb/testsuite/gdb.dwarf2/dw2-icycle.exp b/gdb/testsuite/gdb.dwarf2/dw2-icycle.exp > new file mode 100644 > index 0000000..fcb57b6 > --- /dev/null > +++ b/gdb/testsuite/gdb.dwarf2/dw2-icycle.exp > @@ -0,0 +1,43 @@ > +# Copyright 2014 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see . > +load_lib dwarf.exp > + > +# This test can only be run on targets which support DWARF-2 and use gas. > +if {![dwarf2_support]} { > + return 0 > +} > + > +standard_testfile .S .c > + > +if { [prepare_for_testing ${testfile}.exp ${testfile} \ > + [list $srcfile $srcfile2] {nodebug}] } { > + return -1 > +} > + > +# We are trying to verify that the partial symtab to symtab expansion > +# for the debugging info hand-coded in our assembly file does not cause > +# the debugger to crash (infinite recursion). To facilitate the test, > +# start the debugger with -readnow. This force expansion as soon as > +# the objfile is loaded. > + > +set saved_gdbflags $GDBFLAGS > +set GDBFLAGS "$GDBFLAGS -readnow" > +clean_restart ${testfile} > +set GDBFLAGS $saved_gdbflags > + > +# And just to be sure that the debugger did not crash after having > +# expanded our symbols, do a life-check. > + > +gdb_test "echo life check\\n" "life check" -- lin zuojian