Hi, dropping the optional DWARF attribute DW_AT_sibling has only advantages and no disadvantages:
For files with .gdb_index GDB initial scan does not use DW_AT_sibling at all. For files without .gdb_index GDB initial scan has 1.79% time _improvement_. For .debug files it brings 3.49% size decrease (7.84% for rpm compressed files). I guess DW_AT_sibling had real performance gains on CPUs with 1x (=no) clock multipliers. Nowadays mostly only the data size transferred over FSB matters. I do not think there would be any DWARF consumers compatibility problems as DW_AT_sibling has always been optional but I admit I have tested only GDB. "clean" is FSF GCC+GDB, "ns" is FSF GCC with the patch applied. gdbindex -readnow 100x warm: clean: 56.975 57.161 57.738 58.243 57.52924999999999 seconds ns: 57.799 58.008 58.202 58.473 58.120499999999993 seconds +1.03% = performance decrease but it should be 0%, it is a measurement error gdbindex -readnow 20x warm(gdb) cold(data): clean: 57.989 ns: 58.538 +0.95% = performance decrease but it should be 0%, it is a measurement error 200x warm: clean: 14.393 14.414 14.587 14.496 14.472499999999998 seconds ns: 14.202 14.160 14.174 14.318 14.213499999999998 seconds -1.79% = performance improvement of non-gdbindex scan (dwarf2_build_psymtabs_hard) gdbindex .debug: clean = 5589272 bytes ns = 5394120 bytes -3.49% = size improvement gdbindex .debug.xz9: clean = 1158696 bytes ns = 1067900 bytes -7.84% = size improvement .debug_info + .debug_types: clean = 0x1a11a0+0x08f389 bytes ns = 0x184205+0x0833b0 bytes -7.31% = size improvement Intel i7-920 CPU and only libstdc++ from GCC 4.7.0 20111002 and `-O2 -gdwarf-4 -fdebug-types-section' were used for the benchmark. GCC 4.7.0 20111002 --enable-languages=c++ was used for `make check' regression testing. Thanks, Jan gcc/ 2011-10-12 Jan Kratochvil <jan.kratoch...@redhat.com> Stop producing DW_AT_sibling. * dwarf2out.c (add_sibling_attributes): Remove the declaration. (add_sibling_attributes): Remove the function. (dwarf2out_finish): Remove calls of add_sibling_attributes. --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -3316,7 +3316,6 @@ static int htab_cu_eq (const void *, const void *); static void htab_cu_del (void *); static int check_duplicate_cu (dw_die_ref, htab_t, unsigned *); static void record_comdat_symbol_number (dw_die_ref, htab_t, unsigned); -static void add_sibling_attributes (dw_die_ref); static void build_abbrev_table (dw_die_ref); static void output_location_lists (dw_die_ref); static int constant_size (unsigned HOST_WIDE_INT); @@ -7482,24 +7481,6 @@ copy_decls_for_unworthy_types (dw_die_ref unit) unmark_dies (unit); } -/* Traverse the DIE and add a sibling attribute if it may have the - effect of speeding up access to siblings. To save some space, - avoid generating sibling attributes for DIE's without children. */ - -static void -add_sibling_attributes (dw_die_ref die) -{ - dw_die_ref c; - - if (! die->die_child) - return; - - if (die->die_parent && die != die->die_parent->die_child) - add_AT_die_ref (die, DW_AT_sibling, die->die_sib); - - FOR_EACH_CHILD (die, c, add_sibling_attributes (c)); -} - /* Output all location lists for the DIE and its children. */ static void @@ -22496,14 +22477,6 @@ dwarf2out_finish (const char *filename) prune_unused_types (); } - /* Traverse the DIE's and add add sibling attributes to those DIE's - that have children. */ - add_sibling_attributes (comp_unit_die ()); - for (node = limbo_die_list; node; node = node->next) - add_sibling_attributes (node->die); - for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) - add_sibling_attributes (ctnode->root_die); - /* Output a terminator label for the .text section. */ switch_to_section (text_section); targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);