http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51902
Bug #: 51902 Summary: lexical_blocks inside inlined_subroutines generate duplicate debug_ranges Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug AssignedTo: unassig...@gcc.gnu.org ReportedBy: m...@gcc.gnu.org CC: ja...@gcc.gnu.org, ja...@gcc.gnu.org Created attachment 26380 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26380 debug_ranges.c - Get some statistics on .debug_ranges section. I noticed that when you generate dwarf for an inlined function it often comes with duplicate range lists for both the DW_TAG_inlined_subroutine and the child DW_TAG_lexical_block DIE. For example: static int k; static int foo (int i) { int j = i + 42; return k + (j > 14 ? j : i); } int main (int argc, char **argv) { int c = argc; k = 2 * c; c = foo (c); return c; } Generates with -O2 -gdwarf-4: DWARF section [27] '.debug_info' at offset 0x895: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [...] [ a8] inlined_subroutine abstract_origin (ref4) [ 31] entry_pc (addr) 0x0000000000400360 <main> ranges (data4) range list [ 0] call_file (data1) 1 call_line (data1) 13 [ bb] formal_parameter abstract_origin (ref4) [ 42] location (block1) [ 0] reg5 [ c2] lexical_block ranges (data4) range list [ 40] [ c7] variable abstract_origin (ref4) [ 4b] location (data4) location list [ 23] [...] DWARF section [32] '.debug_ranges' at offset 0xb4e: [ 0] 0x0000000000400360 <main>..0x0000000000400363 <main+0x3> 0x0000000000400366 <main+0x6>..0x0000000000400369 <main+0x9> 0x000000000040036f <main+0xf>..0x0000000000400374 <main+0x14> [ 40] 0x0000000000400360 <main>..0x0000000000400363 <main+0x3> 0x0000000000400366 <main+0x6>..0x0000000000400369 <main+0x9> 0x000000000040036f <main+0xf>..0x0000000000400374 <main+0x14> [ 80] 0x0000000000400360 <main>..0x0000000000400375 So range list 0 for the inlined_subroutine DIE a8 is the same as range list 40 for the lexical_block DIE c2. I wrote a quick and dirty elfutils libdw/libdwfl based program to look for this pattern and it seems to occur reasonably often: $ ./debug_ranges /usr/lib/debug/bin/bash.debug cus: 160 subprograms: 6397 inlined_subroutines: 838 lexical_blocks: 359 dup_ranges: 220 dup_addrs: 1454 $ ./debug_ranges ~/build/gcc-obj/gcc/cc1 cus: 390 subprograms: 84288 inlined_subroutines: 7860 lexical_blocks: 6256 dup_ranges: 5274 dup_addrs: 29190 $ ./debug_ranges /usr/lib/debug/lib/modules/3.1.9-1.fc16.x86_64/vmlinux cus: 1616 subprograms: 108066 inlined_subroutines: 42784 lexical_blocks: 15276 dup_ranges: 7763 dup_addrs: 38586 Given that there will be relocations for .debug_ranges addresses pointing into .text it could even save twice that number of addresses for ET_REL files. See also this thread for a first try of a fix (needs some help): http://gcc.gnu.org/ml/gcc/2012-01/msg00158.html