[PATCH][C++] Avoid PCH dependent mangling

Richard Biener rguenther@suse.de
Tue Sep 15 09:02:00 GMT 2015


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  <rguenther@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 <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)



More information about the Gcc-patches mailing list