[And this time, actually CCing the list :)]. Gentlemen!
Reading in the compiler state for pch (gt_pch_restore) obliterates the DIE table, and consequently the DW_TAG_GNU_[BE]INCL* DIEs that may have been in it. This causes inconsistencies when reading in _any_ pre-compiled header into a source file that uses -feliminate-dwarf2-dups, and consequently already has some DW_TAG_GNU_[BE]INCL* DIEs. Normally the DIE table should be empty this early on, especially since mainline generates dwarf at the end of the compilation unit, but the DIE table may have DW_TAG_GNU_[BE]INCL* DIEs that were created early by dwarf2out_start_source_file/etc or it may have the DW_TAG_compile_unit. I suppose we could merge incoming DIEs with existing DIEs and complicate our lives, but considering we will probably have to tackle this in the debug-early work, I propose we disable this combination for now (and possibly permanently, unless we really care about it). OK for mainline pending tests? Aldy
commit c0814b101417a5639fe70b41526b4e2d7a56ee52 Author: Aldy Hernandez <al...@redhat.com> Date: Thu Feb 19 07:35:59 2015 -0800 PR debug/46102 * c-pch.c (c_common_read_pch): Disable -feliminate-dwarf2-dups if reading a pre-compiled header. diff --git a/gcc/c-family/c-pch.c b/gcc/c-family/c-pch.c index 0ede92a..6b442e2 100644 --- a/gcc/c-family/c-pch.c +++ b/gcc/c-family/c-pch.c @@ -381,6 +381,23 @@ c_common_read_pch (cpp_reader *pfile, const char *name, timevar_pop (TV_PCH_CPP_RESTORE); gt_pch_restore (f); + + /* At pre-compiled header output time, we may have outputted a few + DIEs corresponding to DW_TAG_GNU_[BE]INCL. Reading the compiler + state above will read in these DIEs, and obliterate any + DW_TAG_GNU_[BE]INCL so far generated. + + Disable this combination for now. When early debug generation is + implemented, we can probably get this combo to work. */ + if (flag_eliminate_dwarf2_dups) + { + warning_at (UNKNOWN_LOCATION, 0, + "Pre-compiled headers cannot be used with -feliminate-dwarf2-dups."); + warning_at (UNKNOWN_LOCATION, 0, + "-feliminate-dwarf2-dups has been disabled."); + flag_eliminate_dwarf2_dups = 0; + } + cpp_set_line_map (pfile, line_table); rebuild_location_adhoc_htab (line_table);