On Thu, 27 Aug 2015, Richard Biener wrote: > > With the passes.c hunk in the patch below we FAIL assembly comparison > of g++.dg/pch/system-[12].C because with PCH we have computed > DECL_ASSEMBLER_NAME and thus appended DW_AT_linkage_name early during > PCH generation while without PCH we compute it lazily and end up > appending DW_AT_specification earlier. Thus we have swapped dwarf > attribute order and assembly comparison fails. > > Clearly this kind of "IL" changes dependent on whether we are writing > a PCH file is going to cause differences down the food chain. > (there is another case in instantiate_decl calling add_pending_template > dependent on pch_file) > > Now a simple solution is to simply not do that (mangle decls). Another > would be to always mangle decls where we now do so conditional on PCH. > Another soulution is to declare we don't care about assembly differences > with/without using PCH and remove assembly comparison from the > testsuite harness. > > Bootstrapped on x86_64-unknown-linux-gnu, testing + gdb testing in > progress. > > Ok for trunk (with note_decl_for_pch completely removed)?
Ping. The C++ issue prevents me from refactoring late global decl dwarf and I'd rather not munge that together with this C++ specific issue. Thanks, Richard. > The passes.c hunk is needed because we otherwise miss to properly > create the early DIEs for those kind of globals (we'll be left > with a declaration DIE from the type DIE creation and miss the > definition part). > > Thanks, > Richard. > > 2015-08-27 Richard Biener <rguent...@suse.de> > > * passes.c (rest_of_decl_compilation): Also call early_global_decl > on global definitions in type context. > > cp/ > * semantics.c (note_decl_for_pch): Do not mangle the decl. > > Index: gcc/passes.c > =================================================================== > --- gcc/passes.c (revision 227258) > +++ gcc/passes.c (working copy) > @@ -318,7 +318,15 @@ rest_of_decl_compilation (tree decl, > && !decl_function_context (decl) > && !current_function_decl > && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION > - && !decl_type_context (decl) > + && (!decl_type_context (decl) > + /* If we created a varpool node for the decl make sure to > + call early_global_decl. Otherwise we miss changes > + introduced by member definitions like > + struct A { static int staticdatamember; }; > + int A::staticdatamember; > + and thus have incomplete early debug. */ > + || (TREE_CODE (decl) == VAR_DECL > + && TREE_STATIC (decl) && !DECL_EXTERNAL (decl))) > /* Avoid confusing the debug information machinery when there are > errors. */ > && !seen_error ()) > Index: gcc/cp/semantics.c > =================================================================== > --- gcc/cp/semantics.c (revision 227258) > +++ gcc/cp/semantics.c (working copy) > @@ -2962,15 +2962,21 @@ finish_member_declaration (tree decl) > translation units which include the PCH file. */ > > void > -note_decl_for_pch (tree decl) > +note_decl_for_pch (tree) > { > gcc_assert (pch_file); > > + /* ??? This changes debug info with/without PCH as DW_AT_linkage_name > + attributes are added at different times (early when with PCH > + or late, via pending assembler names, when without PCH). > + See g++.dg/pch/system-[12].C. */ > +#if 0 > /* There's a good chance that we'll have to mangle names at some > point, even if only for emission in debugging information. */ > if (VAR_OR_FUNCTION_DECL_P (decl) > && !processing_template_decl) > mangle_decl (decl); > +#endif > } > > /* Finish processing a complete template declaration. The PARMS are > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)