On Tue, 15 Sep 2015, Richard Biener wrote: > On September 15, 2015 4:25:37 PM GMT+02:00, Jason Merrill <ja...@redhat.com> > wrote: > >On 08/27/2015 09:36 AM, 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. > > > >Hmm, what if we walk through the symtab and mangle everything later, > >when we're about to write the PCH? That should still get the benefit > >of > >doing the mangling work only once, without changing the order of the > >attributes. > > That might work if we can get at all relevant decls that way. If not we > can populate a pointer-set from the function and walk that before > writing the PCH. I can do that if you prefer, I just didn't know if we > care about PCH performance enough to worry.
Ok, so the following fixes my pch.exp issues. It drops note_decl_for_pch in favor of mangling all globals before PCH write. Bootstrap & regtest on x86_64-unknown-linux-gnu in progress, ok for trunk? Thanks, Richard. 2015-09-16 Richard Biener <rguent...@suse.de> cp/ * cp-tree.h (note_decl_for_pch): Remove. * class.c (build_clone): Do not call note_decl_for_pch. * semantics.c (finish_member_declaration): Likewise. (note_decl_for_pch): Remove. * decl2.c (c_parse_final_cleanups): Mangle all globals before writing the PCH. Index: gcc/cp/class.c =================================================================== *** gcc/cp/class.c (revision 227779) --- gcc/cp/class.c (working copy) *************** build_clone (tree fn, tree name) *** 4691,4699 **** SET_DECL_RTL (clone, NULL); rest_of_decl_compilation (clone, /*top_level=*/1, at_eof); - if (pch_file) - note_decl_for_pch (clone); - return clone; } --- 4691,4696 ---- Index: gcc/cp/semantics.c =================================================================== *** gcc/cp/semantics.c (revision 227779) --- gcc/cp/semantics.c (working copy) *************** finish_member_declaration (tree decl) *** 2951,2976 **** maybe_add_class_template_decl_list (current_class_type, decl, /*friend_p=*/0); } - - if (pch_file) - note_decl_for_pch (decl); - } - - /* DECL has been declared while we are building a PCH file. Perform - actions that we might normally undertake lazily, but which can be - performed now so that they do not have to be performed in - translation units which include the PCH file. */ - - void - note_decl_for_pch (tree decl) - { - gcc_assert (pch_file); - - /* 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); } /* Finish processing a complete template declaration. The PARMS are --- 2951,2956 ---- Index: gcc/cp/decl2.c =================================================================== *** gcc/cp/decl2.c (revision 227779) --- gcc/cp/decl2.c (working copy) *************** c_parse_final_cleanups (void) *** 4511,4516 **** --- 4511,4522 ---- In that case we do not want to do anything else. */ if (pch_file) { + /* Mangle all symbols at PCH creation time. */ + symtab_node *node; + FOR_EACH_SYMBOL (node) + if (! is_a <varpool_node *> (node) + || ! DECL_HARD_REGISTER (node->decl)) + DECL_ASSEMBLER_NAME (node->decl); c_common_write_pch (); dump_tu (); return; Index: gcc/cp/cp-tree.h =================================================================== *** gcc/cp/cp-tree.h (revision 227779) --- gcc/cp/cp-tree.h (working copy) *************** extern tree finish_qualified_id_expr (t *** 6253,6259 **** bool, bool, tsubst_flags_t); extern void simplify_aggr_init_expr (tree *); extern void finalize_nrv (tree *, tree, tree); - extern void note_decl_for_pch (tree); extern tree omp_reduction_id (enum tree_code, tree, tree); extern tree cp_remove_omp_priv_cleanup_stmt (tree *, int *, void *); extern void cp_check_omp_declare_reduction (tree); --- 6253,6258 ----